Skip to content

Commit 5edcbbb

Browse files
committed
extend needless_collect
Fix #14350
1 parent 81643e2 commit 5edcbbb

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

clippy_lints/src/methods/needless_collect.rs

+13
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use rustc_span::{Span, sym};
2323

2424
const NEEDLESS_COLLECT_MSG: &str = "avoid using `collect()` when not needed";
2525

26+
#[allow(clippy::too_many_lines)]
2627
pub(super) fn check<'tcx>(
2728
cx: &LateContext<'tcx>,
2829
name_span: Span,
@@ -85,6 +86,18 @@ pub(super) fn check<'tcx>(
8586
sugg,
8687
app,
8788
);
89+
} else if let ExprKind::Index(_, index, _) = parent.kind {
90+
let mut app = Applicability::MachineApplicable;
91+
let snip = snippet_with_applicability(cx, index.span, "??", &mut app);
92+
span_lint_and_sugg(
93+
cx,
94+
NEEDLESS_COLLECT,
95+
call_span.with_hi(parent.span.hi()),
96+
NEEDLESS_COLLECT_MSG,
97+
"replace with",
98+
format!("nth({snip}).unwrap()"),
99+
app,
100+
);
88101
}
89102
},
90103
Node::LetStmt(l) => {

tests/ui/needless_collect.fixed

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ fn main() {
2020
}
2121
sample.iter().cloned().any(|x| x == 1);
2222
//~^ needless_collect
23+
24+
let _ = sample.iter().cloned().nth(1).unwrap();
25+
//~^ needless_collect
26+
2327
// #7164 HashMap's and BTreeMap's `len` usage should not be linted
2428
sample.iter().map(|x| (x, x)).collect::<HashMap<_, _>>().len();
2529
sample.iter().map(|x| (x, x)).collect::<BTreeMap<_, _>>().len();

tests/ui/needless_collect.rs

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ fn main() {
2020
}
2121
sample.iter().cloned().collect::<Vec<_>>().contains(&1);
2222
//~^ needless_collect
23+
24+
let _ = sample.iter().cloned().collect::<Vec<_>>()[1];
25+
//~^ needless_collect
26+
2327
// #7164 HashMap's and BTreeMap's `len` usage should not be linted
2428
sample.iter().map(|x| (x, x)).collect::<HashMap<_, _>>().len();
2529
sample.iter().map(|x| (x, x)).collect::<BTreeMap<_, _>>().len();

tests/ui/needless_collect.stderr

+23-17
Original file line numberDiff line numberDiff line change
@@ -20,100 +20,106 @@ LL | sample.iter().cloned().collect::<Vec<_>>().contains(&1);
2020
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == 1)`
2121

2222
error: avoid using `collect()` when not needed
23-
--> tests/ui/needless_collect.rs:27:35
23+
--> tests/ui/needless_collect.rs:24:36
24+
|
25+
LL | let _ = sample.iter().cloned().collect::<Vec<_>>()[1];
26+
| ^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `nth(1).unwrap()`
27+
28+
error: avoid using `collect()` when not needed
29+
--> tests/ui/needless_collect.rs:31:35
2430
|
2531
LL | sample.iter().map(|x| (x, x)).collect::<HashMap<_, _>>().is_empty();
2632
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
2733

2834
error: avoid using `collect()` when not needed
29-
--> tests/ui/needless_collect.rs:29:35
35+
--> tests/ui/needless_collect.rs:33:35
3036
|
3137
LL | sample.iter().map(|x| (x, x)).collect::<BTreeMap<_, _>>().is_empty();
3238
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
3339

3440
error: avoid using `collect()` when not needed
35-
--> tests/ui/needless_collect.rs:37:19
41+
--> tests/ui/needless_collect.rs:41:19
3642
|
3743
LL | sample.iter().collect::<LinkedList<_>>().len();
3844
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `count()`
3945

4046
error: avoid using `collect()` when not needed
41-
--> tests/ui/needless_collect.rs:39:19
47+
--> tests/ui/needless_collect.rs:43:19
4248
|
4349
LL | sample.iter().collect::<LinkedList<_>>().is_empty();
4450
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
4551

4652
error: avoid using `collect()` when not needed
47-
--> tests/ui/needless_collect.rs:41:28
53+
--> tests/ui/needless_collect.rs:45:28
4854
|
4955
LL | sample.iter().cloned().collect::<LinkedList<_>>().contains(&1);
5056
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == 1)`
5157

5258
error: avoid using `collect()` when not needed
53-
--> tests/ui/needless_collect.rs:43:19
59+
--> tests/ui/needless_collect.rs:47:19
5460
|
5561
LL | sample.iter().collect::<LinkedList<_>>().contains(&&1);
5662
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == &1)`
5763

5864
error: avoid using `collect()` when not needed
59-
--> tests/ui/needless_collect.rs:47:19
65+
--> tests/ui/needless_collect.rs:51:19
6066
|
6167
LL | sample.iter().collect::<BinaryHeap<_>>().len();
6268
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `count()`
6369

6470
error: avoid using `collect()` when not needed
65-
--> tests/ui/needless_collect.rs:49:19
71+
--> tests/ui/needless_collect.rs:53:19
6672
|
6773
LL | sample.iter().collect::<BinaryHeap<_>>().is_empty();
6874
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
6975

7076
error: avoid using `collect()` when not needed
71-
--> tests/ui/needless_collect.rs:55:27
77+
--> tests/ui/needless_collect.rs:59:27
7278
|
7379
LL | let _ = sample.iter().collect::<HashSet<_>>().is_empty();
7480
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
7581

7682
error: avoid using `collect()` when not needed
77-
--> tests/ui/needless_collect.rs:57:27
83+
--> tests/ui/needless_collect.rs:61:27
7884
|
7985
LL | let _ = sample.iter().collect::<HashSet<_>>().contains(&&0);
8086
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == &0)`
8187

8288
error: avoid using `collect()` when not needed
83-
--> tests/ui/needless_collect.rs:80:27
89+
--> tests/ui/needless_collect.rs:84:27
8490
|
8591
LL | let _ = sample.iter().collect::<VecWrapper<_>>().is_empty();
8692
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `next().is_none()`
8793

8894
error: avoid using `collect()` when not needed
89-
--> tests/ui/needless_collect.rs:82:27
95+
--> tests/ui/needless_collect.rs:86:27
9096
|
9197
LL | let _ = sample.iter().collect::<VecWrapper<_>>().contains(&&0);
9298
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `any(|x| x == &0)`
9399

94100
error: avoid using `collect()` when not needed
95-
--> tests/ui/needless_collect.rs:87:40
101+
--> tests/ui/needless_collect.rs:91:40
96102
|
97103
LL | Vec::<u8>::new().extend((0..10).collect::<Vec<_>>());
98104
| ^^^^^^^^^^^^^^^^^^^^ help: remove this call
99105

100106
error: avoid using `collect()` when not needed
101-
--> tests/ui/needless_collect.rs:89:20
107+
--> tests/ui/needless_collect.rs:93:20
102108
|
103109
LL | foo((0..10).collect::<Vec<_>>());
104110
| ^^^^^^^^^^^^^^^^^^^^ help: remove this call
105111

106112
error: avoid using `collect()` when not needed
107-
--> tests/ui/needless_collect.rs:91:49
113+
--> tests/ui/needless_collect.rs:95:49
108114
|
109115
LL | bar((0..10).collect::<Vec<_>>(), (0..10).collect::<Vec<_>>());
110116
| ^^^^^^^^^^^^^^^^^^^^ help: remove this call
111117

112118
error: avoid using `collect()` when not needed
113-
--> tests/ui/needless_collect.rs:93:37
119+
--> tests/ui/needless_collect.rs:97:37
114120
|
115121
LL | baz((0..10), (), ('a'..='z').collect::<Vec<_>>())
116122
| ^^^^^^^^^^^^^^^^^^^^ help: remove this call
117123

118-
error: aborting due to 19 previous errors
124+
error: aborting due to 20 previous errors
119125

0 commit comments

Comments
 (0)