Skip to content

Commit 8cc596c

Browse files
authored
autofix for range_zip_with_len (#14136)
changelog: [`range_zip_with_len`]: add autofix
2 parents 5211148 + a5329bd commit 8cc596c

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

clippy_lints/src/methods/range_zip_with_len.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use clippy_utils::diagnostics::span_lint;
1+
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::snippet;
33
use clippy_utils::{SpanlessEq, higher, is_integer_const, is_trait_method};
4+
use rustc_errors::Applicability;
45
use rustc_hir::{Expr, ExprKind, QPath};
56
use rustc_lint::LateContext;
67
use rustc_span::sym;
@@ -20,14 +21,14 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, recv: &'
2021
&& let ExprKind::Path(QPath::Resolved(_, len_path)) = len_recv.kind
2122
&& SpanlessEq::new(cx).eq_path_segments(iter_path.segments, len_path.segments)
2223
{
23-
span_lint(
24+
span_lint_and_sugg(
2425
cx,
2526
RANGE_ZIP_WITH_LEN,
2627
expr.span,
27-
format!(
28-
"it is more idiomatic to use `{}.iter().enumerate()`",
29-
snippet(cx, recv.span, "_")
30-
),
28+
"using `.zip()` with a range and `.len()`",
29+
"try",
30+
format!("{}.iter().enumerate()", snippet(cx, recv.span, "_")),
31+
Applicability::MachineApplicable,
3132
);
3233
}
3334
}

tests/ui/range.fixed

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#![allow(clippy::useless_vec)]
2+
#[warn(clippy::range_zip_with_len)]
3+
fn main() {
4+
let v1 = vec![1, 2, 3];
5+
let v2 = vec![4, 5];
6+
let _x = v1.iter().enumerate();
7+
//~^ ERROR: using `.zip()` with a range and `.len()`
8+
let _y = v1.iter().zip(0..v2.len()); // No error
9+
}
10+
11+
#[allow(unused)]
12+
fn no_panic_with_fake_range_types() {
13+
struct Range {
14+
foo: i32,
15+
}
16+
17+
let _ = Range { foo: 0 };
18+
}

tests/ui/range.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ fn main() {
44
let v1 = vec![1, 2, 3];
55
let v2 = vec![4, 5];
66
let _x = v1.iter().zip(0..v1.len());
7-
//~^ ERROR: it is more idiomatic to use `v1.iter().enumerate()`
8-
//~| NOTE: `-D clippy::range-zip-with-len` implied by `-D warnings`
7+
//~^ ERROR: using `.zip()` with a range and `.len()`
98
let _y = v1.iter().zip(0..v2.len()); // No error
109
}
1110

tests/ui/range.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error: it is more idiomatic to use `v1.iter().enumerate()`
1+
error: using `.zip()` with a range and `.len()`
22
--> tests/ui/range.rs:6:14
33
|
44
LL | let _x = v1.iter().zip(0..v1.len());
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `v1.iter().enumerate()`
66
|
77
= note: `-D clippy::range-zip-with-len` implied by `-D warnings`
88
= help: to override `-D warnings` add `#[allow(clippy::range_zip_with_len)]`

0 commit comments

Comments
 (0)