mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-17 06:26:55 +00:00
return when the ty doesn't have len()
This commit is contained in:
parent
9958af4229
commit
cc2b00055c
@ -1,7 +1,8 @@
|
||||
use crate::utils::{
|
||||
derefs_to_slice, is_type_diagnostic_item, match_trait_method, method_chain_args, paths, snippet_with_applicability,
|
||||
derefs_to_slice, is_type_diagnostic_item, match_type, method_chain_args, paths, snippet_with_applicability,
|
||||
span_lint_and_sugg,
|
||||
};
|
||||
|
||||
use if_chain::if_chain;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir::Expr;
|
||||
@ -19,19 +20,29 @@ pub(crate) fn lints<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'_>, iter_args: &'
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let ty = cx.typeck_results().expr_ty(&iter_args[0]);
|
||||
if_chain! {
|
||||
let caller_type = if derefs_to_slice(cx, &iter_args[0], cx.typeck_results().expr_ty(&iter_args[0])).is_some() {
|
||||
Some("slice")
|
||||
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(&iter_args[0]), sym::vec_type) {
|
||||
Some("Vec")
|
||||
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(&iter_args[0]), sym!(vecdeque_type)) {
|
||||
Some("VecDeque")
|
||||
} else if match_trait_method(cx, expr, &paths::ITERATOR) {
|
||||
Some("std::iter::Iterator")
|
||||
let caller_type = if derefs_to_slice(cx, &iter_args[0], ty).is_some() {
|
||||
"slice"
|
||||
} else if is_type_diagnostic_item(cx, ty, sym::vec_type) {
|
||||
"Vec"
|
||||
} else if is_type_diagnostic_item(cx, ty, sym!(vecdeque_type)) {
|
||||
"VecDeque"
|
||||
} else if is_type_diagnostic_item(cx, ty, sym!(hashset_type)) {
|
||||
"HashSet"
|
||||
} else if is_type_diagnostic_item(cx, ty, sym!(hashmap_type)) {
|
||||
"HashMap"
|
||||
} else if match_type(cx, ty, &paths::BTREEMAP) {
|
||||
"BTreeMap"
|
||||
} else if match_type(cx, ty, &paths::BTREESET) {
|
||||
"BTreeSet"
|
||||
} else if match_type(cx, ty, &paths::LINKED_LIST) {
|
||||
"LinkedList"
|
||||
} else if match_type(cx, ty, &paths::BINARY_HEAP) {
|
||||
"BinaryHeap"
|
||||
} else {
|
||||
None
|
||||
return
|
||||
};
|
||||
if let Some(caller_type) = caller_type;
|
||||
then {
|
||||
let mut applicability = Applicability::MachineApplicable;
|
||||
span_lint_and_sugg(
|
||||
|
@ -13,7 +13,7 @@
|
||||
extern crate option_helpers;
|
||||
|
||||
use option_helpers::IteratorFalsePositives;
|
||||
use std::collections::{HashSet, VecDeque};
|
||||
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
|
||||
|
||||
/// Struct to generate false positives for things with `.iter()`.
|
||||
#[derive(Copy, Clone)]
|
||||
@ -38,21 +38,45 @@ fn main() {
|
||||
let mut boxed_slice: Box<[u8]> = Box::new([0, 1, 2, 3]);
|
||||
let mut vec_deque: VecDeque<_> = vec.iter().cloned().collect();
|
||||
let mut hash_set = HashSet::new();
|
||||
let mut hash_map = HashMap::new();
|
||||
let mut b_tree_map = BTreeMap::new();
|
||||
let mut b_tree_set = BTreeSet::new();
|
||||
let mut linked_list = LinkedList::new();
|
||||
let mut binary_heap = BinaryHeap::new();
|
||||
hash_set.insert(1);
|
||||
hash_map.insert(1, 2);
|
||||
b_tree_map.insert(1, 2);
|
||||
b_tree_set.insert(1);
|
||||
linked_list.push_back(1);
|
||||
binary_heap.push(1);
|
||||
|
||||
&vec[..].len();
|
||||
vec.len();
|
||||
boxed_slice.len();
|
||||
vec_deque.len();
|
||||
hash_set.len();
|
||||
hash_map.len();
|
||||
b_tree_map.len();
|
||||
b_tree_set.len();
|
||||
linked_list.len();
|
||||
binary_heap.len();
|
||||
|
||||
vec.len();
|
||||
&vec[..].len();
|
||||
vec_deque.len();
|
||||
hash_map.len();
|
||||
b_tree_map.len();
|
||||
linked_list.len();
|
||||
|
||||
&vec[..].len();
|
||||
vec.len();
|
||||
vec_deque.len();
|
||||
hash_set.len();
|
||||
hash_map.len();
|
||||
b_tree_map.len();
|
||||
b_tree_set.len();
|
||||
linked_list.len();
|
||||
binary_heap.len();
|
||||
|
||||
// Make sure we don't lint for non-relevant types.
|
||||
let false_positive = HasIter;
|
||||
|
@ -13,7 +13,7 @@
|
||||
extern crate option_helpers;
|
||||
|
||||
use option_helpers::IteratorFalsePositives;
|
||||
use std::collections::{HashSet, VecDeque};
|
||||
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
|
||||
|
||||
/// Struct to generate false positives for things with `.iter()`.
|
||||
#[derive(Copy, Clone)]
|
||||
@ -38,21 +38,45 @@ fn main() {
|
||||
let mut boxed_slice: Box<[u8]> = Box::new([0, 1, 2, 3]);
|
||||
let mut vec_deque: VecDeque<_> = vec.iter().cloned().collect();
|
||||
let mut hash_set = HashSet::new();
|
||||
let mut hash_map = HashMap::new();
|
||||
let mut b_tree_map = BTreeMap::new();
|
||||
let mut b_tree_set = BTreeSet::new();
|
||||
let mut linked_list = LinkedList::new();
|
||||
let mut binary_heap = BinaryHeap::new();
|
||||
hash_set.insert(1);
|
||||
hash_map.insert(1, 2);
|
||||
b_tree_map.insert(1, 2);
|
||||
b_tree_set.insert(1);
|
||||
linked_list.push_back(1);
|
||||
binary_heap.push(1);
|
||||
|
||||
&vec[..].iter().count();
|
||||
vec.iter().count();
|
||||
boxed_slice.iter().count();
|
||||
vec_deque.iter().count();
|
||||
hash_set.iter().count();
|
||||
hash_map.iter().count();
|
||||
b_tree_map.iter().count();
|
||||
b_tree_set.iter().count();
|
||||
linked_list.iter().count();
|
||||
binary_heap.iter().count();
|
||||
|
||||
vec.iter_mut().count();
|
||||
&vec[..].iter_mut().count();
|
||||
vec_deque.iter_mut().count();
|
||||
hash_map.iter_mut().count();
|
||||
b_tree_map.iter_mut().count();
|
||||
linked_list.iter_mut().count();
|
||||
|
||||
&vec[..].into_iter().count();
|
||||
vec.into_iter().count();
|
||||
vec_deque.into_iter().count();
|
||||
hash_set.into_iter().count();
|
||||
hash_map.into_iter().count();
|
||||
b_tree_map.into_iter().count();
|
||||
b_tree_set.into_iter().count();
|
||||
linked_list.into_iter().count();
|
||||
binary_heap.into_iter().count();
|
||||
|
||||
// Make sure we don't lint for non-relevant types.
|
||||
let false_positive = HasIter;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: called `.iter().count()` on a `slice`
|
||||
--> $DIR/iter_count.rs:43:6
|
||||
--> $DIR/iter_count.rs:53:6
|
||||
|
|
||||
LL | &vec[..].iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec[..].len()`
|
||||
@ -7,64 +7,148 @@ LL | &vec[..].iter().count();
|
||||
= note: `-D clippy::iter-count` implied by `-D warnings`
|
||||
|
||||
error: called `.iter().count()` on a `Vec`
|
||||
--> $DIR/iter_count.rs:44:5
|
||||
--> $DIR/iter_count.rs:54:5
|
||||
|
|
||||
LL | vec.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^ help: try: `vec.len()`
|
||||
|
||||
error: called `.iter().count()` on a `slice`
|
||||
--> $DIR/iter_count.rs:45:5
|
||||
--> $DIR/iter_count.rs:55:5
|
||||
|
|
||||
LL | boxed_slice.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `boxed_slice.len()`
|
||||
|
||||
error: called `.iter().count()` on a `VecDeque`
|
||||
--> $DIR/iter_count.rs:46:5
|
||||
--> $DIR/iter_count.rs:56:5
|
||||
|
|
||||
LL | vec_deque.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec_deque.len()`
|
||||
|
||||
error: called `.iter().count()` on a `std::iter::Iterator`
|
||||
--> $DIR/iter_count.rs:47:5
|
||||
error: called `.iter().count()` on a `HashSet`
|
||||
--> $DIR/iter_count.rs:57:5
|
||||
|
|
||||
LL | hash_set.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_set.len()`
|
||||
|
||||
error: called `.iter().count()` on a `HashMap`
|
||||
--> $DIR/iter_count.rs:58:5
|
||||
|
|
||||
LL | hash_map.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_map.len()`
|
||||
|
||||
error: called `.iter().count()` on a `BTreeMap`
|
||||
--> $DIR/iter_count.rs:59:5
|
||||
|
|
||||
LL | b_tree_map.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b_tree_map.len()`
|
||||
|
||||
error: called `.iter().count()` on a `BTreeSet`
|
||||
--> $DIR/iter_count.rs:60:5
|
||||
|
|
||||
LL | b_tree_set.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b_tree_set.len()`
|
||||
|
||||
error: called `.iter().count()` on a `LinkedList`
|
||||
--> $DIR/iter_count.rs:61:5
|
||||
|
|
||||
LL | linked_list.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `linked_list.len()`
|
||||
|
||||
error: called `.iter().count()` on a `BinaryHeap`
|
||||
--> $DIR/iter_count.rs:62:5
|
||||
|
|
||||
LL | binary_heap.iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `binary_heap.len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `Vec`
|
||||
--> $DIR/iter_count.rs:49:5
|
||||
--> $DIR/iter_count.rs:64:5
|
||||
|
|
||||
LL | vec.iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `slice`
|
||||
--> $DIR/iter_count.rs:50:6
|
||||
--> $DIR/iter_count.rs:65:6
|
||||
|
|
||||
LL | &vec[..].iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec[..].len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `VecDeque`
|
||||
--> $DIR/iter_count.rs:51:5
|
||||
--> $DIR/iter_count.rs:66:5
|
||||
|
|
||||
LL | vec_deque.iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec_deque.len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `HashMap`
|
||||
--> $DIR/iter_count.rs:67:5
|
||||
|
|
||||
LL | hash_map.iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_map.len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `BTreeMap`
|
||||
--> $DIR/iter_count.rs:68:5
|
||||
|
|
||||
LL | b_tree_map.iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b_tree_map.len()`
|
||||
|
||||
error: called `.iter_mut().count()` on a `LinkedList`
|
||||
--> $DIR/iter_count.rs:69:5
|
||||
|
|
||||
LL | linked_list.iter_mut().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `linked_list.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `slice`
|
||||
--> $DIR/iter_count.rs:53:6
|
||||
--> $DIR/iter_count.rs:71:6
|
||||
|
|
||||
LL | &vec[..].into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec[..].len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `Vec`
|
||||
--> $DIR/iter_count.rs:54:5
|
||||
--> $DIR/iter_count.rs:72:5
|
||||
|
|
||||
LL | vec.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `VecDeque`
|
||||
--> $DIR/iter_count.rs:55:5
|
||||
--> $DIR/iter_count.rs:73:5
|
||||
|
|
||||
LL | vec_deque.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `vec_deque.len()`
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
error: called `.into_iter().count()` on a `HashSet`
|
||||
--> $DIR/iter_count.rs:74:5
|
||||
|
|
||||
LL | hash_set.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_set.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `HashMap`
|
||||
--> $DIR/iter_count.rs:75:5
|
||||
|
|
||||
LL | hash_map.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_map.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `BTreeMap`
|
||||
--> $DIR/iter_count.rs:76:5
|
||||
|
|
||||
LL | b_tree_map.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b_tree_map.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `BTreeSet`
|
||||
--> $DIR/iter_count.rs:77:5
|
||||
|
|
||||
LL | b_tree_set.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `b_tree_set.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `LinkedList`
|
||||
--> $DIR/iter_count.rs:78:5
|
||||
|
|
||||
LL | linked_list.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `linked_list.len()`
|
||||
|
||||
error: called `.into_iter().count()` on a `BinaryHeap`
|
||||
--> $DIR/iter_count.rs:79:5
|
||||
|
|
||||
LL | binary_heap.into_iter().count();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `binary_heap.len()`
|
||||
|
||||
error: aborting due to 25 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user