diff options
| author | bors <bors@rust-lang.org> | 2023-06-03 19:05:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-06-03 19:05:01 +0000 |
| commit | fdb0b0445879fd6a14e46fc934c2dcb637cd183c (patch) | |
| tree | b77f2d4129860fa8f47ef8d915db9889e2826f90 | |
| parent | 8a30f2f71a72f6e842452427bcc19947d614d889 (diff) | |
| parent | 5a7e33e5b25c6ee9b71897f2fd1a84d8c839dcf9 (diff) | |
| download | rust-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.rs | 22 | ||||
| -rw-r--r-- | tests/ui/useless_conversion.stderr | 10 |
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 |
