Skip to content

Commit 85a988e

Browse files
committed
Use a proper test for if the parameter is unused
Instead of comparing it to a wildcard, we actually check that it is unused using a utility from `clippy_utils`.
1 parent 6517985 commit 85a988e

File tree

4 files changed

+30
-20
lines changed

4 files changed

+30
-20
lines changed

clippy_lints/src/methods/map_with_unused_argument_over_ranges.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::methods::MAP_WITH_UNUSED_ARGUMENT_OVER_RANGES;
22
use clippy_config::msrvs::{self, Msrv};
33
use clippy_utils::diagnostics::span_lint_and_then;
4-
use clippy_utils::higher;
54
use clippy_utils::source::snippet_with_applicability;
5+
use clippy_utils::usage;
66
use rustc_ast::ast::RangeLimits;
77
use rustc_ast::LitKind;
88
use rustc_data_structures::packed::Pu128;
@@ -64,9 +64,9 @@ pub(super) fn check(
6464
let mut applicability = Applicability::MaybeIncorrect;
6565
if let Some(range) = higher::Range::hir(receiver)
6666
&& let ExprKind::Closure(Closure { body, .. }) = arg.kind
67-
&& let Body { params: [param], .. } = cx.tcx.hir().body(*body)
68-
// TODO: We should also look for a named, but unused parameter here
69-
&& matches!(param.pat.kind, PatKind::Wild)
67+
&& let body_hir = cx.tcx.hir().body(*body)
68+
&& let Body { params: [param], .. } = body_hir
69+
&& !usage::BindingUsageFinder::are_params_used(cx, body_hir)
7070
&& let Some(count) = extract_count_with_applicability(cx, range, &mut applicability)
7171
{
7272
// TODO: Check if we can switch_to_eager_eval here and do away with `repeat_with` and instad use

tests/ui/map_with_unused_argument_over_ranges.fixed

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ macro_rules! gen {
1818
fn main() {
1919
// These should be raised
2020
std::iter::repeat_with(|| do_something()).take(10);
21+
std::iter::repeat_with(|| do_something()).take(10);
2122
std::iter::repeat_with(|| do_something()).take(11);
2223
std::iter::repeat_with(|| do_something()).take(7);
2324
std::iter::repeat_with(|| do_something()).take(8);
@@ -42,8 +43,6 @@ fn main() {
4243
(lower..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4344
(lower_fn()..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4445
(lower_fn()..=upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
45-
(0..10).map(|x| do_something()); // We do not detect unused parameters
46-
(0..10).map(|x| do_something()).collect::<Vec<_>>(); // We do not detect unused parameters
4746
(0..10).map(|x| do_something_interesting(x, 4)); // Actual map over range
4847
"Foobar".chars().map(|_| do_something()); // Not a map over range
4948
}

tests/ui/map_with_unused_argument_over_ranges.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ macro_rules! gen {
1818
fn main() {
1919
// These should be raised
2020
(0..10).map(|_| do_something());
21+
(0..10).map(|_foo| do_something());
2122
(0..=10).map(|_| do_something());
2223
(3..10).map(|_| do_something());
2324
(3..=10).map(|_| do_something());
@@ -42,8 +43,6 @@ fn main() {
4243
(lower..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4344
(lower_fn()..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4445
(lower_fn()..=upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
45-
(0..10).map(|x| do_something()); // We do not detect unused parameters
46-
(0..10).map(|x| do_something()).collect::<Vec<_>>(); // We do not detect unused parameters
4746
(0..10).map(|x| do_something_interesting(x, 4)); // Actual map over range
4847
"Foobar".chars().map(|_| do_something()); // Not a map over range
4948
}

tests/ui/map_with_unused_argument_over_ranges.stderr

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ LL + std::iter::repeat_with(|| do_something()).take(10);
1515
error: map of a closure that does not depend on its parameter over a range
1616
--> tests/ui/map_with_unused_argument_over_ranges.rs:21:5
1717
|
18+
LL | (0..10).map(|_foo| do_something());
19+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
20+
|
21+
help: remove the explicit range and use `repeat_with` and `take`
22+
|
23+
LL - (0..10).map(|_foo| do_something());
24+
LL + std::iter::repeat_with(|| do_something()).take(10);
25+
|
26+
27+
error: map of a closure that does not depend on its parameter over a range
28+
--> tests/ui/map_with_unused_argument_over_ranges.rs:22:5
29+
|
1830
LL | (0..=10).map(|_| do_something());
1931
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2032
|
@@ -25,7 +37,7 @@ LL + std::iter::repeat_with(|| do_something()).take(11);
2537
|
2638

2739
error: map of a closure that does not depend on its parameter over a range
28-
--> tests/ui/map_with_unused_argument_over_ranges.rs:22:5
40+
--> tests/ui/map_with_unused_argument_over_ranges.rs:23:5
2941
|
3042
LL | (3..10).map(|_| do_something());
3143
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -37,7 +49,7 @@ LL + std::iter::repeat_with(|| do_something()).take(7);
3749
|
3850

3951
error: map of a closure that does not depend on its parameter over a range
40-
--> tests/ui/map_with_unused_argument_over_ranges.rs:23:5
52+
--> tests/ui/map_with_unused_argument_over_ranges.rs:24:5
4153
|
4254
LL | (3..=10).map(|_| do_something());
4355
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -49,7 +61,7 @@ LL + std::iter::repeat_with(|| do_something()).take(8);
4961
|
5062

5163
error: map of a closure that does not depend on its parameter over a range
52-
--> tests/ui/map_with_unused_argument_over_ranges.rs:24:5
64+
--> tests/ui/map_with_unused_argument_over_ranges.rs:25:5
5365
|
5466
LL | (0..10).map(|_| 3);
5567
| ^^^^^^^^^^^^^^^^^^
@@ -61,7 +73,7 @@ LL + std::iter::repeat_with(|| 3).take(10);
6173
|
6274

6375
error: map of a closure that does not depend on its parameter over a range
64-
--> tests/ui/map_with_unused_argument_over_ranges.rs:25:5
76+
--> tests/ui/map_with_unused_argument_over_ranges.rs:26:5
6577
|
6678
LL | / (0..10).map(|_| {
6779
LL | | let x = 3;
@@ -78,7 +90,7 @@ LL ~ }).take(10);
7890
|
7991

8092
error: map of a closure that does not depend on its parameter over a range
81-
--> tests/ui/map_with_unused_argument_over_ranges.rs:29:5
93+
--> tests/ui/map_with_unused_argument_over_ranges.rs:30:5
8294
|
8395
LL | (0..10).map(|_| do_something()).collect::<Vec<_>>();
8496
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -90,7 +102,7 @@ LL + std::iter::repeat_with(|| do_something()).take(10).collect::<Vec<_>>();
90102
|
91103

92104
error: map of a closure that does not depend on its parameter over a range
93-
--> tests/ui/map_with_unused_argument_over_ranges.rs:31:5
105+
--> tests/ui/map_with_unused_argument_over_ranges.rs:32:5
94106
|
95107
LL | (0..upper).map(|_| do_something());
96108
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -102,7 +114,7 @@ LL + std::iter::repeat_with(|| do_something()).take(upper);
102114
|
103115

104116
error: map of a closure that does not depend on its parameter over a range
105-
--> tests/ui/map_with_unused_argument_over_ranges.rs:33:5
117+
--> tests/ui/map_with_unused_argument_over_ranges.rs:34:5
106118
|
107119
LL | (0..upper_fn()).map(|_| do_something());
108120
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -114,7 +126,7 @@ LL + std::iter::repeat_with(|| do_something()).take(upper_fn());
114126
|
115127

116128
error: map of a closure that does not depend on its parameter over a range
117-
--> tests/ui/map_with_unused_argument_over_ranges.rs:34:5
129+
--> tests/ui/map_with_unused_argument_over_ranges.rs:35:5
118130
|
119131
LL | (0..=upper_fn()).map(|_| do_something());
120132
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -126,7 +138,7 @@ LL + std::iter::repeat_with(|| do_something()).take(upper_fn() + 1);
126138
|
127139

128140
error: map of a closure that does not depend on its parameter over a range
129-
--> tests/ui/map_with_unused_argument_over_ranges.rs:35:5
141+
--> tests/ui/map_with_unused_argument_over_ranges.rs:36:5
130142
|
131143
LL | (2..upper_fn()).map(|_| do_something());
132144
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -138,7 +150,7 @@ LL + std::iter::repeat_with(|| do_something()).take(upper_fn() - 2);
138150
|
139151

140152
error: map of a closure that does not depend on its parameter over a range
141-
--> tests/ui/map_with_unused_argument_over_ranges.rs:36:5
153+
--> tests/ui/map_with_unused_argument_over_ranges.rs:37:5
142154
|
143155
LL | (2..=upper_fn()).map(|_| do_something());
144156
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -150,7 +162,7 @@ LL + std::iter::repeat_with(|| do_something()).take(upper_fn() - 1);
150162
|
151163

152164
error: map of a closure that does not depend on its parameter over a range
153-
--> tests/ui/map_with_unused_argument_over_ranges.rs:58:5
165+
--> tests/ui/map_with_unused_argument_over_ranges.rs:57:5
154166
|
155167
LL | (0..10).map(|_| do_something());
156168
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -161,5 +173,5 @@ LL - (0..10).map(|_| do_something());
161173
LL + std::iter::repeat_with(|| do_something()).take(10);
162174
|
163175

164-
error: aborting due to 13 previous errors
176+
error: aborting due to 14 previous errors
165177

0 commit comments

Comments
 (0)