Skip to content

Commit 2e9ec3a

Browse files
committed
Fix bug in computing the count and reword message
1 parent 74ce976 commit 2e9ec3a

File tree

4 files changed

+40
-36
lines changed

4 files changed

+40
-36
lines changed

clippy_lints/src/methods/map_with_unused_argument_over_ranges.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ fn extract_count_with_applicability(
1818
let start = range.start?;
1919
let end = range.end?;
2020
// TODO: This doens't handle if either the start or end are negative literals, or if the start is
21-
// not a literal In the first case, we need to be careful about how we handle computing the
21+
// not a literal. In the first case, we need to be careful about how we handle computing the
2222
// count to avoid overflows. In the second, we may need to add parenthesis to make the
2323
// suggestion correct.
2424
if let ExprKind::Lit(lit) = start.kind
@@ -41,10 +41,14 @@ fn extract_count_with_applicability(
4141
} else {
4242
return Some(end_snippet);
4343
};
44-
} else if range.limits == RangeLimits::Closed {
45-
return Some(format!("{} + {}", end_snippet, lower_bound + 1));
44+
}
45+
if range.limits == RangeLimits::Closed {
46+
if lower_bound > 0 {
47+
return Some(format!("{end_snippet} - {}", lower_bound - 1));
48+
}
49+
return Some(format!("{end_snippet} + 1"));
4650
} else {
47-
return Some(format!("{} + {}", end_snippet, lower_bound));
51+
return Some(format!("{end_snippet} - {lower_bound}"));
4852
};
4953
}
5054
}
@@ -71,7 +75,7 @@ pub(super) fn check(cx: &LateContext<'_>, ex: &Expr<'_>, receiver: &Expr<'_>, ar
7175
cx,
7276
MAP_WITH_UNUSED_ARGUMENT_OVER_RANGES,
7377
ex.span,
74-
"map of a trivial closure (not dependent on parameter) over a range",
78+
"map of a closure that does not depend on its parameter over a range",
7579
"use",
7680
format!("std::iter::repeat_with({snippet}).take({count})"),
7781
applicability,

tests/ui/map_with_unused_argument_over_ranges.fixed

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fn main() {
2020
std::iter::repeat_with(|| do_something()).take(10);
2121
std::iter::repeat_with(|| do_something()).take(11);
2222
std::iter::repeat_with(|| do_something()).take(7);
23+
std::iter::repeat_with(|| do_something()).take(8);
2324
std::iter::repeat_with(|| 3).take(10);
2425
std::iter::repeat_with(|| {
2526
let x = 3;
@@ -31,14 +32,13 @@ fn main() {
3132
let upper_fn = || 4;
3233
std::iter::repeat_with(|| do_something()).take(upper_fn());
3334
std::iter::repeat_with(|| do_something()).take(upper_fn() + 1);
34-
std::iter::repeat_with(|| do_something()).take(upper_fn() + 2);
35-
std::iter::repeat_with(|| do_something()).take(upper_fn() + 3);
35+
std::iter::repeat_with(|| do_something()).take(upper_fn() - 2);
36+
std::iter::repeat_with(|| do_something()).take(upper_fn() - 1);
3637
(-3..9).map(|_| do_something());
3738
// These should not be raised
3839
gen!();
3940
let lower = 2;
4041
let lower_fn = || 2;
41-
std::iter::repeat_with(|| do_something()).take(upper_fn() + 2); // Ranges not starting at zero not yet handled
4242
(lower..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4343
(lower_fn()..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4444
(lower_fn()..=upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled

tests/ui/map_with_unused_argument_over_ranges.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fn main() {
2020
(0..10).map(|_| do_something());
2121
(0..=10).map(|_| do_something());
2222
(3..10).map(|_| do_something());
23+
(3..=10).map(|_| do_something());
2324
(0..10).map(|_| 3);
2425
(0..10).map(|_| {
2526
let x = 3;
@@ -38,7 +39,6 @@ fn main() {
3839
gen!();
3940
let lower = 2;
4041
let lower_fn = || 2;
41-
(2..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4242
(lower..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4343
(lower_fn()..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
4444
(lower_fn()..=upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled

tests/ui/map_with_unused_argument_over_ranges.stderr

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: map of a trivial closure (not dependent on parameter) over a range
1+
error: map of a closure that does not depend on its parameter over a range
22
--> tests/ui/map_with_unused_argument_over_ranges.rs:20:5
33
|
44
LL | (0..10).map(|_| do_something());
@@ -7,26 +7,32 @@ LL | (0..10).map(|_| do_something());
77
= note: `-D clippy::map-with-unused-argument-over-ranges` implied by `-D warnings`
88
= help: to override `-D warnings` add `#[allow(clippy::map_with_unused_argument_over_ranges)]`
99

10-
error: map of a trivial closure (not dependent on parameter) over a range
10+
error: map of a closure that does not depend on its parameter over a range
1111
--> tests/ui/map_with_unused_argument_over_ranges.rs:21:5
1212
|
1313
LL | (0..=10).map(|_| do_something());
1414
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(11)`
1515

16-
error: map of a trivial closure (not dependent on parameter) over a range
16+
error: map of a closure that does not depend on its parameter over a range
1717
--> tests/ui/map_with_unused_argument_over_ranges.rs:22:5
1818
|
1919
LL | (3..10).map(|_| do_something());
2020
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(7)`
2121

22-
error: map of a trivial closure (not dependent on parameter) over a range
22+
error: map of a closure that does not depend on its parameter over a range
2323
--> tests/ui/map_with_unused_argument_over_ranges.rs:23:5
2424
|
25+
LL | (3..=10).map(|_| do_something());
26+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(8)`
27+
28+
error: map of a closure that does not depend on its parameter over a range
29+
--> tests/ui/map_with_unused_argument_over_ranges.rs:24:5
30+
|
2531
LL | (0..10).map(|_| 3);
2632
| ^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| 3).take(10)`
2733

28-
error: map of a trivial closure (not dependent on parameter) over a range
29-
--> tests/ui/map_with_unused_argument_over_ranges.rs:24:5
34+
error: map of a closure that does not depend on its parameter over a range
35+
--> tests/ui/map_with_unused_argument_over_ranges.rs:25:5
3036
|
3137
LL | / (0..10).map(|_| {
3238
LL | | let x = 3;
@@ -42,49 +48,43 @@ LL + x + 2
4248
LL ~ }).take(10);
4349
|
4450

45-
error: map of a trivial closure (not dependent on parameter) over a range
46-
--> tests/ui/map_with_unused_argument_over_ranges.rs:28:5
51+
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:29:5
4753
|
4854
LL | (0..10).map(|_| do_something()).collect::<Vec<_>>();
4955
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(10)`
5056

51-
error: map of a trivial closure (not dependent on parameter) over a range
52-
--> tests/ui/map_with_unused_argument_over_ranges.rs:30:5
57+
error: map of a closure that does not depend on its parameter over a range
58+
--> tests/ui/map_with_unused_argument_over_ranges.rs:31:5
5359
|
5460
LL | (0..upper).map(|_| do_something());
5561
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper)`
5662

57-
error: map of a trivial closure (not dependent on parameter) over a range
58-
--> tests/ui/map_with_unused_argument_over_ranges.rs:32:5
63+
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:33:5
5965
|
6066
LL | (0..upper_fn()).map(|_| do_something());
6167
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn())`
6268

63-
error: map of a trivial closure (not dependent on parameter) over a range
64-
--> tests/ui/map_with_unused_argument_over_ranges.rs:33:5
69+
error: map of a closure that does not depend on its parameter over a range
70+
--> tests/ui/map_with_unused_argument_over_ranges.rs:34:5
6571
|
6672
LL | (0..=upper_fn()).map(|_| do_something());
6773
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() + 1)`
6874

69-
error: map of a trivial closure (not dependent on parameter) over a range
70-
--> tests/ui/map_with_unused_argument_over_ranges.rs:34:5
75+
error: map of a closure that does not depend on its parameter over a range
76+
--> tests/ui/map_with_unused_argument_over_ranges.rs:35:5
7177
|
7278
LL | (2..upper_fn()).map(|_| do_something());
73-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() + 2)`
79+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() - 2)`
7480

75-
error: map of a trivial closure (not dependent on parameter) over a range
76-
--> tests/ui/map_with_unused_argument_over_ranges.rs:35:5
81+
error: map of a closure that does not depend on its parameter over a range
82+
--> tests/ui/map_with_unused_argument_over_ranges.rs:36:5
7783
|
7884
LL | (2..=upper_fn()).map(|_| do_something());
79-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() + 3)`
80-
81-
error: map of a trivial closure (not dependent on parameter) over a range
82-
--> tests/ui/map_with_unused_argument_over_ranges.rs:41:5
83-
|
84-
LL | (2..upper_fn()).map(|_| do_something()); // Ranges not starting at zero not yet handled
85-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() + 2)`
85+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `std::iter::repeat_with(|| do_something()).take(upper_fn() - 1)`
8686

87-
error: map of a trivial closure (not dependent on parameter) over a range
87+
error: map of a closure that does not depend on its parameter over a range
8888
--> tests/ui/map_with_unused_argument_over_ranges.rs:58:5
8989
|
9090
LL | (0..10).map(|_| do_something());

0 commit comments

Comments
 (0)