summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_lints/src/loops/mod.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /src/tools/clippy/clippy_lints/src/loops/mod.rs
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/tools/clippy/clippy_lints/src/loops/mod.rs')
-rw-r--r--src/tools/clippy/clippy_lints/src/loops/mod.rs95
1 files changed, 53 insertions, 42 deletions
diff --git a/src/tools/clippy/clippy_lints/src/loops/mod.rs b/src/tools/clippy/clippy_lints/src/loops/mod.rs
index f83ad388a..529189b52 100644
--- a/src/tools/clippy/clippy_lints/src/loops/mod.rs
+++ b/src/tools/clippy/clippy_lints/src/loops/mod.rs
@@ -20,9 +20,10 @@ mod while_let_loop;
mod while_let_on_iterator;
use clippy_utils::higher;
+use clippy_utils::msrvs::Msrv;
use rustc_hir::{Expr, ExprKind, LoopSource, Pat};
use rustc_lint::{LateContext, LateLintPass};
-use rustc_session::{declare_lint_pass, declare_tool_lint};
+use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::source_map::Span;
use utils::{make_iterator_snippet, IncrementVisitor, InitializeVisitor};
@@ -479,7 +480,7 @@ declare_clippy_lint! {
declare_clippy_lint! {
/// ### What it does
- /// Check for unnecessary `if let` usage in a for loop
+ /// Checks for unnecessary `if let` usage in a for loop
/// where only the `Some` or `Ok` variant of the iterator element is used.
///
/// ### Why is this bad?
@@ -511,7 +512,7 @@ declare_clippy_lint! {
declare_clippy_lint! {
/// ### What it does
- /// Check for empty spin loops
+ /// Checks for empty spin loops
///
/// ### Why is this bad?
/// The loop body should have something like `thread::park()` or at least
@@ -547,7 +548,7 @@ declare_clippy_lint! {
declare_clippy_lint! {
/// ### What it does
- /// Check for manual implementations of Iterator::find
+ /// Checks for manual implementations of Iterator::find
///
/// ### Why is this bad?
/// It doesn't affect performance, but using `find` is shorter and easier to read.
@@ -606,7 +607,15 @@ declare_clippy_lint! {
"checking for emptiness of a `Vec` in the loop condition and popping an element in the body"
}
-declare_lint_pass!(Loops => [
+pub struct Loops {
+ msrv: Msrv,
+}
+impl Loops {
+ pub fn new(msrv: Msrv) -> Self {
+ Self { msrv }
+ }
+}
+impl_lint_pass!(Loops => [
MANUAL_MEMCPY,
MANUAL_FLATTEN,
NEEDLESS_RANGE_LOOP,
@@ -645,7 +654,7 @@ impl<'tcx> LateLintPass<'tcx> for Loops {
if body.span.from_expansion() {
return;
}
- check_for_loop(cx, pat, arg, body, expr, span);
+ self.check_for_loop(cx, pat, arg, body, expr, span);
if let ExprKind::Block(block, _) = body.kind {
never_loop::check(cx, block, loop_id, span, for_loop.as_ref());
}
@@ -678,46 +687,48 @@ impl<'tcx> LateLintPass<'tcx> for Loops {
manual_while_let_some::check(cx, condition, body, span);
}
}
+
+ extract_msrv_attr!(LateContext);
}
-fn check_for_loop<'tcx>(
- cx: &LateContext<'tcx>,
- pat: &'tcx Pat<'_>,
- arg: &'tcx Expr<'_>,
- body: &'tcx Expr<'_>,
- expr: &'tcx Expr<'_>,
- span: Span,
-) {
- let is_manual_memcpy_triggered = manual_memcpy::check(cx, pat, arg, body, expr);
- if !is_manual_memcpy_triggered {
- needless_range_loop::check(cx, pat, arg, body, expr);
- explicit_counter_loop::check(cx, pat, arg, body, expr);
+impl Loops {
+ fn check_for_loop<'tcx>(
+ &self,
+ cx: &LateContext<'tcx>,
+ pat: &'tcx Pat<'_>,
+ arg: &'tcx Expr<'_>,
+ body: &'tcx Expr<'_>,
+ expr: &'tcx Expr<'_>,
+ span: Span,
+ ) {
+ let is_manual_memcpy_triggered = manual_memcpy::check(cx, pat, arg, body, expr);
+ if !is_manual_memcpy_triggered {
+ needless_range_loop::check(cx, pat, arg, body, expr);
+ explicit_counter_loop::check(cx, pat, arg, body, expr);
+ }
+ self.check_for_loop_arg(cx, pat, arg);
+ for_kv_map::check(cx, pat, arg, body);
+ mut_range_bound::check(cx, arg, body);
+ single_element_loop::check(cx, pat, arg, body, expr);
+ same_item_push::check(cx, pat, arg, body, expr);
+ manual_flatten::check(cx, pat, arg, body, span);
+ manual_find::check(cx, pat, arg, body, span, expr);
}
- check_for_loop_arg(cx, pat, arg);
- for_kv_map::check(cx, pat, arg, body);
- mut_range_bound::check(cx, arg, body);
- single_element_loop::check(cx, pat, arg, body, expr);
- same_item_push::check(cx, pat, arg, body, expr);
- manual_flatten::check(cx, pat, arg, body, span);
- manual_find::check(cx, pat, arg, body, span, expr);
-}
-fn check_for_loop_arg(cx: &LateContext<'_>, _: &Pat<'_>, arg: &Expr<'_>) {
- if let ExprKind::MethodCall(method, self_arg, [], _) = arg.kind {
- let method_name = method.ident.as_str();
- // check for looping over x.iter() or x.iter_mut(), could use &x or &mut x
- match method_name {
- "iter" | "iter_mut" => {
- explicit_iter_loop::check(cx, self_arg, arg, method_name);
- },
- "into_iter" => {
- explicit_iter_loop::check(cx, self_arg, arg, method_name);
- explicit_into_iter_loop::check(cx, self_arg, arg);
- },
- "next" => {
- iter_next_loop::check(cx, arg);
- },
- _ => {},
+ fn check_for_loop_arg(&self, cx: &LateContext<'_>, _: &Pat<'_>, arg: &Expr<'_>) {
+ if let ExprKind::MethodCall(method, self_arg, [], _) = arg.kind {
+ match method.ident.as_str() {
+ "iter" | "iter_mut" => {
+ explicit_iter_loop::check(cx, self_arg, arg, &self.msrv);
+ },
+ "into_iter" => {
+ explicit_into_iter_loop::check(cx, self_arg, arg);
+ },
+ "next" => {
+ iter_next_loop::check(cx, arg);
+ },
+ _ => {},
+ }
}
}
}