about summary refs log tree commit diff
diff options
context:
space:
mode:
authorlapla-cogito <me@lapla.dev>2025-02-02 23:44:22 +0900
committerlapla-cogito <me@lapla.dev>2025-02-02 23:44:22 +0900
commita5329bd8d38983a57fd66098745099048fa90a2a (patch)
tree615e3d4b27cb4331fc8b77ceef0fcb19331dbe59
parent88a00a87fa99ef934430b73a6327e0211c79e8a0 (diff)
downloadrust-a5329bd8d38983a57fd66098745099048fa90a2a.tar.gz
rust-a5329bd8d38983a57fd66098745099048fa90a2a.zip
autofix for `range_zip_with_len`
-rw-r--r--clippy_lints/src/methods/range_zip_with_len.rs13
-rw-r--r--tests/ui/range.fixed18
-rw-r--r--tests/ui/range.rs3
-rw-r--r--tests/ui/range.stderr4
4 files changed, 28 insertions, 10 deletions
diff --git a/clippy_lints/src/methods/range_zip_with_len.rs b/clippy_lints/src/methods/range_zip_with_len.rs
index f4d206c5307..3a5e3217208 100644
--- a/clippy_lints/src/methods/range_zip_with_len.rs
+++ b/clippy_lints/src/methods/range_zip_with_len.rs
@@ -1,6 +1,7 @@
-use clippy_utils::diagnostics::span_lint;
+use clippy_utils::diagnostics::span_lint_and_sugg;
 use clippy_utils::source::snippet;
 use clippy_utils::{SpanlessEq, higher, is_integer_const, is_trait_method};
+use rustc_errors::Applicability;
 use rustc_hir::{Expr, ExprKind, QPath};
 use rustc_lint::LateContext;
 use rustc_span::sym;
@@ -20,14 +21,14 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, recv: &'
         && let ExprKind::Path(QPath::Resolved(_, len_path)) = len_recv.kind
         && SpanlessEq::new(cx).eq_path_segments(iter_path.segments, len_path.segments)
     {
-        span_lint(
+        span_lint_and_sugg(
             cx,
             RANGE_ZIP_WITH_LEN,
             expr.span,
-            format!(
-                "it is more idiomatic to use `{}.iter().enumerate()`",
-                snippet(cx, recv.span, "_")
-            ),
+            "using `.zip()` with a range and `.len()`",
+            "try",
+            format!("{}.iter().enumerate()", snippet(cx, recv.span, "_")),
+            Applicability::MachineApplicable,
         );
     }
 }
diff --git a/tests/ui/range.fixed b/tests/ui/range.fixed
new file mode 100644
index 00000000000..82aa1b5f94f
--- /dev/null
+++ b/tests/ui/range.fixed
@@ -0,0 +1,18 @@
+#![allow(clippy::useless_vec)]
+#[warn(clippy::range_zip_with_len)]
+fn main() {
+    let v1 = vec![1, 2, 3];
+    let v2 = vec![4, 5];
+    let _x = v1.iter().enumerate();
+    //~^ ERROR: using `.zip()` with a range and `.len()`
+    let _y = v1.iter().zip(0..v2.len()); // No error
+}
+
+#[allow(unused)]
+fn no_panic_with_fake_range_types() {
+    struct Range {
+        foo: i32,
+    }
+
+    let _ = Range { foo: 0 };
+}
diff --git a/tests/ui/range.rs b/tests/ui/range.rs
index 9541812b069..a7d5cf38dfb 100644
--- a/tests/ui/range.rs
+++ b/tests/ui/range.rs
@@ -4,8 +4,7 @@ fn main() {
     let v1 = vec![1, 2, 3];
     let v2 = vec![4, 5];
     let _x = v1.iter().zip(0..v1.len());
-    //~^ ERROR: it is more idiomatic to use `v1.iter().enumerate()`
-    //~| NOTE: `-D clippy::range-zip-with-len` implied by `-D warnings`
+    //~^ ERROR: using `.zip()` with a range and `.len()`
     let _y = v1.iter().zip(0..v2.len()); // No error
 }
 
diff --git a/tests/ui/range.stderr b/tests/ui/range.stderr
index 8c71a209700..798ce1842d8 100644
--- a/tests/ui/range.stderr
+++ b/tests/ui/range.stderr
@@ -1,8 +1,8 @@
-error: it is more idiomatic to use `v1.iter().enumerate()`
+error: using `.zip()` with a range and `.len()`
   --> tests/ui/range.rs:6:14
    |
 LL |     let _x = v1.iter().zip(0..v1.len());
-   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `v1.iter().enumerate()`
    |
    = note: `-D clippy::range-zip-with-len` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::range_zip_with_len)]`