Skip to content

Commit 5a7e33e

Browse files
committed
add plural form to useless_conversion if depth > 0
1 parent 8a30f2f commit 5a7e33e

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

clippy_lints/src/useless_conversion.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,13 @@ fn into_iter_call<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>) -> Option<
9393
/// Same as [`into_iter_call`], but tries to look for the innermost `.into_iter()` call, e.g.:
9494
/// `foo.into_iter().into_iter()`
9595
/// ^^^ we want this expression
96-
fn into_iter_deep_call<'hir>(cx: &LateContext<'_>, mut expr: &'hir Expr<'hir>) -> Option<&'hir Expr<'hir>> {
97-
loop {
98-
if let Some(recv) = into_iter_call(cx, expr) {
99-
expr = recv;
100-
} else {
101-
return Some(expr);
102-
}
96+
fn into_iter_deep_call<'hir>(cx: &LateContext<'_>, mut expr: &'hir Expr<'hir>) -> (&'hir Expr<'hir>, usize) {
97+
let mut depth = 0;
98+
while let Some(recv) = into_iter_call(cx, expr) {
99+
expr = recv;
100+
depth += 1;
103101
}
102+
(expr, depth)
104103
}
105104

106105
#[expect(clippy::too_many_lines)]
@@ -170,18 +169,19 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
170169
&& let Some(&into_iter_param) = sig.inputs().get(kind.param_pos(arg_pos))
171170
&& let ty::Param(param) = into_iter_param.kind()
172171
&& let Some(span) = into_iter_bound(cx, parent_fn_did, into_iter_did, param.index)
172+
{
173173
// Get the "innermost" `.into_iter()` call, e.g. given this expression:
174174
// `foo.into_iter().into_iter()`
175175
// ^^^
176-
// We want this span
177-
&& let Some(into_iter_recv) = into_iter_deep_call(cx, into_iter_recv)
178-
{
176+
let (into_iter_recv, depth) = into_iter_deep_call(cx, into_iter_recv);
177+
178+
let plural = if depth == 0 { "" } else { "s" };
179179
let mut applicability = Applicability::MachineApplicable;
180180
let sugg = snippet_with_applicability(cx, into_iter_recv.span.source_callsite(), "<expr>", &mut applicability).into_owned();
181181
span_lint_and_then(cx, USELESS_CONVERSION, e.span, "explicit call to `.into_iter()` in function argument accepting `IntoIterator`", |diag| {
182182
diag.span_suggestion(
183183
e.span,
184-
"consider removing `.into_iter()`",
184+
format!("consider removing the `.into_iter()`{plural}"),
185185
sugg,
186186
applicability,
187187
);

tests/ui/useless_conversion.stderr

+5-5
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
122122
--> $DIR/useless_conversion.rs:171:7
123123
|
124124
LL | b(vec![1, 2].into_iter());
125-
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
125+
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
126126
|
127127
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
128128
--> $DIR/useless_conversion.rs:161:13
@@ -134,7 +134,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
134134
--> $DIR/useless_conversion.rs:172:7
135135
|
136136
LL | c(vec![1, 2].into_iter());
137-
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
137+
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
138138
|
139139
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
140140
--> $DIR/useless_conversion.rs:162:18
@@ -146,7 +146,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
146146
--> $DIR/useless_conversion.rs:173:7
147147
|
148148
LL | d(vec![1, 2].into_iter());
149-
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
149+
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
150150
|
151151
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
152152
--> $DIR/useless_conversion.rs:165:12
@@ -158,7 +158,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
158158
--> $DIR/useless_conversion.rs:176:7
159159
|
160160
LL | b(vec![1, 2].into_iter().into_iter());
161-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
161+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`s: `vec![1, 2]`
162162
|
163163
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
164164
--> $DIR/useless_conversion.rs:161:13
@@ -170,7 +170,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
170170
--> $DIR/useless_conversion.rs:177:7
171171
|
172172
LL | b(vec![1, 2].into_iter().into_iter().into_iter());
173-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
173+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`s: `vec![1, 2]`
174174
|
175175
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
176176
--> $DIR/useless_conversion.rs:161:13

0 commit comments

Comments
 (0)