about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-06-03 19:05:01 +0000
committerbors <bors@rust-lang.org>2023-06-03 19:05:01 +0000
commitfdb0b0445879fd6a14e46fc934c2dcb637cd183c (patch)
treeb77f2d4129860fa8f47ef8d915db9889e2826f90
parent8a30f2f71a72f6e842452427bcc19947d614d889 (diff)
parent5a7e33e5b25c6ee9b71897f2fd1a84d8c839dcf9 (diff)
downloadrust-fdb0b0445879fd6a14e46fc934c2dcb637cd183c.tar.gz
rust-fdb0b0445879fd6a14e46fc934c2dcb637cd183c.zip
Auto merge of #10881 - y21:explicit-into-iter-fn-arg-followup, r=llogiq
[`useless_conversion`]: pluralize if there are multiple `.into_iter()` calls

context: https://github.com/rust-lang/rust-clippy/pull/10814#issuecomment-1575036086

changelog: [`useless_conversion`]: pluralize if there are multiple `.into_iter()` calls in the chain

r? `@llogiq`
-rw-r--r--clippy_lints/src/useless_conversion.rs22
-rw-r--r--tests/ui/useless_conversion.stderr10
2 files changed, 16 insertions, 16 deletions
diff --git a/clippy_lints/src/useless_conversion.rs b/clippy_lints/src/useless_conversion.rs
index 6f1e9d5f9de..c413e92ea91 100644
--- a/clippy_lints/src/useless_conversion.rs
+++ b/clippy_lints/src/useless_conversion.rs
@@ -93,14 +93,13 @@ fn into_iter_call<'hir>(cx: &LateContext<'_>, expr: &'hir Expr<'hir>) -> Option<
 /// Same as [`into_iter_call`], but tries to look for the innermost `.into_iter()` call, e.g.:
 /// `foo.into_iter().into_iter()`
 ///  ^^^  we want this expression
-fn into_iter_deep_call<'hir>(cx: &LateContext<'_>, mut expr: &'hir Expr<'hir>) -> Option<&'hir Expr<'hir>> {
-    loop {
-        if let Some(recv) = into_iter_call(cx, expr) {
-            expr = recv;
-        } else {
-            return Some(expr);
-        }
+fn into_iter_deep_call<'hir>(cx: &LateContext<'_>, mut expr: &'hir Expr<'hir>) -> (&'hir Expr<'hir>, usize) {
+    let mut depth = 0;
+    while let Some(recv) = into_iter_call(cx, expr) {
+        expr = recv;
+        depth += 1;
     }
+    (expr, depth)
 }
 
 #[expect(clippy::too_many_lines)]
@@ -170,18 +169,19 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
                             && let Some(&into_iter_param) = sig.inputs().get(kind.param_pos(arg_pos))
                             && let ty::Param(param) = into_iter_param.kind()
                             && let Some(span) = into_iter_bound(cx, parent_fn_did, into_iter_did, param.index)
+                        {
                             // Get the "innermost" `.into_iter()` call, e.g. given this expression:
                             // `foo.into_iter().into_iter()`
                             //  ^^^
-                            //  We want this span
-                            && let Some(into_iter_recv) = into_iter_deep_call(cx, into_iter_recv)
-                        {
+                            let (into_iter_recv, depth) = into_iter_deep_call(cx, into_iter_recv);
+
+                            let plural = if depth == 0 { "" } else { "s" };
                             let mut applicability = Applicability::MachineApplicable;
                             let sugg = snippet_with_applicability(cx, into_iter_recv.span.source_callsite(), "<expr>", &mut applicability).into_owned();
                             span_lint_and_then(cx, USELESS_CONVERSION, e.span, "explicit call to `.into_iter()` in function argument accepting `IntoIterator`", |diag| {
                                 diag.span_suggestion(
                                     e.span,
-                                    "consider removing `.into_iter()`",
+                                    format!("consider removing the `.into_iter()`{plural}"),
                                     sugg,
                                     applicability,
                                 );
diff --git a/tests/ui/useless_conversion.stderr b/tests/ui/useless_conversion.stderr
index 68f38faab59..4957f73a469 100644
--- a/tests/ui/useless_conversion.stderr
+++ b/tests/ui/useless_conversion.stderr
@@ -122,7 +122,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
   --> $DIR/useless_conversion.rs:171:7
    |
 LL |     b(vec![1, 2].into_iter());
-   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
+   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
    |
 note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
   --> $DIR/useless_conversion.rs:161:13
@@ -134,7 +134,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
   --> $DIR/useless_conversion.rs:172:7
    |
 LL |     c(vec![1, 2].into_iter());
-   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
+   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
    |
 note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
   --> $DIR/useless_conversion.rs:162:18
@@ -146,7 +146,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
   --> $DIR/useless_conversion.rs:173:7
    |
 LL |     d(vec![1, 2].into_iter());
-   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
+   |       ^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `vec![1, 2]`
    |
 note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
   --> $DIR/useless_conversion.rs:165:12
@@ -158,7 +158,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
   --> $DIR/useless_conversion.rs:176:7
    |
 LL |     b(vec![1, 2].into_iter().into_iter());
-   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
+   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`s: `vec![1, 2]`
    |
 note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
   --> $DIR/useless_conversion.rs:161:13
@@ -170,7 +170,7 @@ error: explicit call to `.into_iter()` in function argument accepting `IntoItera
   --> $DIR/useless_conversion.rs:177:7
    |
 LL |     b(vec![1, 2].into_iter().into_iter().into_iter());
-   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `vec![1, 2]`
+   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`s: `vec![1, 2]`
    |
 note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
   --> $DIR/useless_conversion.rs:161:13