mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-15 01:17:16 +00:00
fix
This commit is contained in:
parent
61ff54e5c2
commit
79ed23ff81
4 changed files with 95 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
use super::SINGLE_ELEMENT_LOOP;
|
||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::source::{indent_of, snippet_with_applicability};
|
||||
use clippy_utils::visitors::for_each_expr;
|
||||
use if_chain::if_chain;
|
||||
use rustc_ast::util::parser::PREC_PREFIX;
|
||||
use rustc_ast::Mutability;
|
||||
|
@ -8,6 +9,18 @@ use rustc_errors::Applicability;
|
|||
use rustc_hir::{is_range_literal, BorrowKind, Expr, ExprKind, Pat};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_span::edition::Edition;
|
||||
use std::ops::ControlFlow;
|
||||
|
||||
fn contains_break_or_continue(expr: &Expr<'_>) -> bool {
|
||||
for_each_expr(expr, |e| {
|
||||
if matches!(e.kind, ExprKind::Break(..) | ExprKind::Continue(..)) {
|
||||
ControlFlow::Break(())
|
||||
} else {
|
||||
ControlFlow::Continue(())
|
||||
}
|
||||
})
|
||||
.is_some()
|
||||
}
|
||||
|
||||
pub(super) fn check<'tcx>(
|
||||
cx: &LateContext<'tcx>,
|
||||
|
@ -67,6 +80,7 @@ pub(super) fn check<'tcx>(
|
|||
if_chain! {
|
||||
if let ExprKind::Block(block, _) = body.kind;
|
||||
if !block.stmts.is_empty();
|
||||
if !contains_break_or_continue(body);
|
||||
then {
|
||||
let mut applicability = Applicability::MachineApplicable;
|
||||
let pat_snip = snippet_with_applicability(cx, pat.span, "..", &mut applicability);
|
||||
|
|
|
@ -33,4 +33,31 @@ fn main() {
|
|||
let item = 0..5;
|
||||
dbg!(item);
|
||||
}
|
||||
|
||||
// should not lint (issue #10018)
|
||||
for e in [42] {
|
||||
if e > 0 {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// should not lint (issue #10018)
|
||||
for e in [42] {
|
||||
if e > 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// should lint (issue #10018)
|
||||
{
|
||||
let _ = 42;
|
||||
let _f = |n: u32| {
|
||||
for i in 0..n {
|
||||
if i > 10 {
|
||||
dbg!(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,4 +27,30 @@ fn main() {
|
|||
for item in [0..5].into_iter() {
|
||||
dbg!(item);
|
||||
}
|
||||
|
||||
// should not lint (issue #10018)
|
||||
for e in [42] {
|
||||
if e > 0 {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// should not lint (issue #10018)
|
||||
for e in [42] {
|
||||
if e > 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// should lint (issue #10018)
|
||||
for _ in [42] {
|
||||
let _f = |n: u32| {
|
||||
for i in 0..n {
|
||||
if i > 10 {
|
||||
dbg!(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -95,5 +95,32 @@ LL + dbg!(item);
|
|||
LL + }
|
||||
|
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: for loop over a single element
|
||||
--> $DIR/single_element_loop.rs:46:5
|
||||
|
|
||||
LL | / for _ in [42] {
|
||||
LL | | let _f = |n: u32| {
|
||||
LL | | for i in 0..n {
|
||||
LL | | if i > 10 {
|
||||
... |
|
||||
LL | | };
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
help: try
|
||||
|
|
||||
LL ~ {
|
||||
LL + let _ = 42;
|
||||
LL + let _f = |n: u32| {
|
||||
LL + for i in 0..n {
|
||||
LL + if i > 10 {
|
||||
LL + dbg!(i);
|
||||
LL + break;
|
||||
LL + }
|
||||
LL + }
|
||||
LL + };
|
||||
LL + }
|
||||
|
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue