Skip to content

Commit 31ee767

Browse files
committed
Extend iter_on lints to catch more cases
1 parent 2153c0f commit 31ee767

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+754
-336
lines changed

clippy_lints/src/dereference.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use rustc_trait_selection::infer::InferCtxtExt as _;
3737
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
3838
use rustc_trait_selection::traits::{Obligation, ObligationCause};
3939
use std::collections::VecDeque;
40+
use std::iter::once;
4041

4142
declare_clippy_lint! {
4243
/// ### What it does
@@ -455,7 +456,7 @@ impl<'tcx> LateLintPass<'tcx> for Dereferencing<'tcx> {
455456
&& cx.tcx.infer_ctxt().build()
456457
.type_implements_trait(
457458
trait_id,
458-
[impl_ty.into()].into_iter().chain(subs.iter().copied()),
459+
once(impl_ty.into()).chain(subs.iter().copied()),
459460
cx.param_env,
460461
)
461462
.must_apply_modulo_regions()

clippy_lints/src/manual_strip.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::iter::once;
2+
13
use clippy_utils::consts::{constant, Constant};
24
use clippy_utils::diagnostics::{multispan_sugg, span_lint_and_then};
35
use clippy_utils::msrvs::{self, Msrv};
@@ -112,11 +114,11 @@ impl<'tcx> LateLintPass<'tcx> for ManualStrip {
112114
multispan_sugg(
113115
diag,
114116
&format!("try using the `strip_{kind_word}` method"),
115-
vec![(test_span,
117+
once((test_span,
116118
format!("if let Some(<stripped>) = {}.strip_{kind_word}({}) ",
117119
snippet(cx, target_arg.span, ".."),
118-
snippet(cx, pattern.span, "..")))]
119-
.into_iter().chain(strippings.into_iter().map(|span| (span, "<stripped>".into()))),
120+
snippet(cx, pattern.span, ".."))))
121+
.chain(strippings.into_iter().map(|span| (span, "<stripped>".into()))),
120122
);
121123
});
122124
}

clippy_lints/src/methods/iter_on_single_or_empty_collections.rs

Lines changed: 0 additions & 92 deletions
This file was deleted.

clippy_lints/src/methods/mod.rs

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ mod iter_kv_map;
4242
mod iter_next_slice;
4343
mod iter_nth;
4444
mod iter_nth_zero;
45-
mod iter_on_single_or_empty_collections;
4645
mod iter_overeager_cloned;
4746
mod iter_skip_next;
4847
mod iter_skip_zero;
@@ -83,6 +82,7 @@ mod single_char_add_str;
8382
mod single_char_insert_string;
8483
mod single_char_pattern;
8584
mod single_char_push_string;
85+
mod single_or_empty_collections_iter;
8686
mod skip_while_next;
8787
mod stable_sort_primitive;
8888
mod str_splitn;
@@ -2430,15 +2430,15 @@ declare_clippy_lint! {
24302430

24312431
declare_clippy_lint! {
24322432
/// ### What it does
2433-
///
2434-
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on collections containing a single item
2433+
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on collections containing a single item.
24352434
///
24362435
/// ### Why is this bad?
2436+
/// It is simpler to use the once function from the standard library.
24372437
///
2438-
/// It is simpler to use the once function from the standard library:
2438+
/// ### Known problems
2439+
/// The type of the resulting iterator might become incompatible with its usage.
24392440
///
24402441
/// ### Example
2441-
///
24422442
/// ```rust
24432443
/// let a = [123].iter();
24442444
/// let b = Some(123).into_iter();
@@ -2449,27 +2449,23 @@ declare_clippy_lint! {
24492449
/// let a = iter::once(&123);
24502450
/// let b = iter::once(123);
24512451
/// ```
2452-
///
2453-
/// ### Known problems
2454-
///
2455-
/// The type of the resulting iterator might become incompatible with its usage
24562452
#[clippy::version = "1.65.0"]
24572453
pub ITER_ON_SINGLE_ITEMS,
2458-
nursery,
2454+
pedantic,
24592455
"Iterator for array of length 1"
24602456
}
24612457

24622458
declare_clippy_lint! {
24632459
/// ### What it does
2464-
///
2465-
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on empty collections
2460+
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on empty collections.
24662461
///
24672462
/// ### Why is this bad?
2463+
/// It is simpler to use the empty function from the standard library.
24682464
///
2469-
/// It is simpler to use the empty function from the standard library:
2465+
/// ### Known problems
2466+
/// The type of the resulting iterator might become incompatible with its usage.
24702467
///
24712468
/// ### Example
2472-
///
24732469
/// ```rust
24742470
/// use std::{slice, option};
24752471
/// let a: slice::Iter<i32> = [].iter();
@@ -2481,13 +2477,9 @@ declare_clippy_lint! {
24812477
/// let a: iter::Empty<i32> = iter::empty();
24822478
/// let b: iter::Empty<i32> = iter::empty();
24832479
/// ```
2484-
///
2485-
/// ### Known problems
2486-
///
2487-
/// The type of the resulting iterator might become incompatible with its usage
24882480
#[clippy::version = "1.65.0"]
24892481
pub ITER_ON_EMPTY_COLLECTIONS,
2490-
nursery,
2482+
pedantic,
24912483
"Iterator for empty array"
24922484
}
24932485

@@ -3629,6 +3621,8 @@ fn method_call<'tcx>(
36293621

36303622
impl<'tcx> LateLintPass<'tcx> for Methods {
36313623
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>) {
3624+
single_or_empty_collections_iter::check(cx, expr, &self.msrv);
3625+
36323626
if expr.span.from_expansion() {
36333627
return;
36343628
}
@@ -3924,9 +3918,6 @@ impl Methods {
39243918
("is_digit", [radix]) => is_digit_ascii_radix::check(cx, expr, recv, radix, &self.msrv),
39253919
("is_none", []) => check_is_some_is_none(cx, expr, recv, false),
39263920
("is_some", []) => check_is_some_is_none(cx, expr, recv, true),
3927-
("iter" | "iter_mut" | "into_iter", []) => {
3928-
iter_on_single_or_empty_collections::check(cx, expr, name, recv);
3929-
},
39303921
("join", [join_arg]) => {
39313922
if let Some(("collect", _, _, span, _)) = method_call(recv) {
39323923
unnecessary_join::check(cx, expr, recv, join_arg, span);

0 commit comments

Comments
 (0)