Skip to content

Commit 324f806

Browse files
committed
Extend iter_on lints to catch more cases
1 parent 588c1ab commit 324f806

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

+849
-347
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(args.iter().copied()),
459+
once(impl_ty.into()).chain(args.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
@@ -43,7 +43,6 @@ mod iter_kv_map;
4343
mod iter_next_slice;
4444
mod iter_nth;
4545
mod iter_nth_zero;
46-
mod iter_on_single_or_empty_collections;
4746
mod iter_overeager_cloned;
4847
mod iter_skip_next;
4948
mod iter_skip_zero;
@@ -85,6 +84,7 @@ mod single_char_add_str;
8584
mod single_char_insert_string;
8685
mod single_char_pattern;
8786
mod single_char_push_string;
87+
mod single_or_empty_collections_iter;
8888
mod skip_while_next;
8989
mod stable_sort_primitive;
9090
mod str_splitn;
@@ -2432,15 +2432,15 @@ declare_clippy_lint! {
24322432

24332433
declare_clippy_lint! {
24342434
/// ### What it does
2435-
///
2436-
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on collections containing a single item
2435+
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on collections containing a single item.
24372436
///
24382437
/// ### Why is this bad?
2438+
/// It is simpler to use the once function from the standard library.
24392439
///
2440-
/// It is simpler to use the once function from the standard library:
2440+
/// ### Known problems
2441+
/// The type of the resulting iterator might become incompatible with its usage.
24412442
///
24422443
/// ### Example
2443-
///
24442444
/// ```rust
24452445
/// let a = [123].iter();
24462446
/// let b = Some(123).into_iter();
@@ -2451,27 +2451,23 @@ declare_clippy_lint! {
24512451
/// let a = iter::once(&123);
24522452
/// let b = iter::once(123);
24532453
/// ```
2454-
///
2455-
/// ### Known problems
2456-
///
2457-
/// The type of the resulting iterator might become incompatible with its usage
24582454
#[clippy::version = "1.65.0"]
24592455
pub ITER_ON_SINGLE_ITEMS,
2460-
nursery,
2456+
pedantic,
24612457
"Iterator for array of length 1"
24622458
}
24632459

24642460
declare_clippy_lint! {
24652461
/// ### What it does
2466-
///
2467-
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on empty collections
2462+
/// Checks for calls to `iter`, `iter_mut` or `into_iter` on empty collections.
24682463
///
24692464
/// ### Why is this bad?
2465+
/// It is simpler to use the empty function from the standard library.
24702466
///
2471-
/// It is simpler to use the empty function from the standard library:
2467+
/// ### Known problems
2468+
/// The type of the resulting iterator might become incompatible with its usage.
24722469
///
24732470
/// ### Example
2474-
///
24752471
/// ```rust
24762472
/// use std::{slice, option};
24772473
/// let a: slice::Iter<i32> = [].iter();
@@ -2483,13 +2479,9 @@ declare_clippy_lint! {
24832479
/// let a: iter::Empty<i32> = iter::empty();
24842480
/// let b: iter::Empty<i32> = iter::empty();
24852481
/// ```
2486-
///
2487-
/// ### Known problems
2488-
///
2489-
/// The type of the resulting iterator might become incompatible with its usage
24902482
#[clippy::version = "1.65.0"]
24912483
pub ITER_ON_EMPTY_COLLECTIONS,
2492-
nursery,
2484+
pedantic,
24932485
"Iterator for empty array"
24942486
}
24952487

@@ -3695,6 +3687,8 @@ fn method_call<'tcx>(
36953687

36963688
impl<'tcx> LateLintPass<'tcx> for Methods {
36973689
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>) {
3690+
single_or_empty_collections_iter::check(cx, expr, &self.msrv);
3691+
36983692
if expr.span.from_expansion() {
36993693
return;
37003694
}
@@ -3991,9 +3985,6 @@ impl Methods {
39913985
("is_digit", [radix]) => is_digit_ascii_radix::check(cx, expr, recv, radix, &self.msrv),
39923986
("is_none", []) => check_is_some_is_none(cx, expr, recv, false),
39933987
("is_some", []) => check_is_some_is_none(cx, expr, recv, true),
3994-
("iter" | "iter_mut" | "into_iter", []) => {
3995-
iter_on_single_or_empty_collections::check(cx, expr, name, recv);
3996-
},
39973988
("join", [join_arg]) => {
39983989
if let Some(("collect", _, _, span, _)) = method_call(recv) {
39993990
unnecessary_join::check(cx, expr, recv, join_arg, span);

0 commit comments

Comments
 (0)