]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/loops/single_element_loop.rs
Rollup merge of #93613 - crlf0710:rename_to_async_iter, r=yaahc
[rust.git] / src / tools / clippy / clippy_lints / src / loops / single_element_loop.rs
1 use super::SINGLE_ELEMENT_LOOP;
2 use clippy_utils::diagnostics::span_lint_and_sugg;
3 use clippy_utils::source::{indent_of, snippet_with_applicability};
4 use if_chain::if_chain;
5 use rustc_errors::Applicability;
6 use rustc_hir::{BorrowKind, Expr, ExprKind, Pat};
7 use rustc_lint::LateContext;
8
9 pub(super) fn check<'tcx>(
10     cx: &LateContext<'tcx>,
11     pat: &'tcx Pat<'_>,
12     arg: &'tcx Expr<'_>,
13     body: &'tcx Expr<'_>,
14     expr: &'tcx Expr<'_>,
15 ) {
16     let arg_expr = match arg.kind {
17         ExprKind::AddrOf(BorrowKind::Ref, _, ref_arg) => ref_arg,
18         ExprKind::MethodCall(method, [arg], _) if method.ident.name == rustc_span::sym::iter => arg,
19         _ => return,
20     };
21     if_chain! {
22         if let ExprKind::Array([arg_expression]) = arg_expr.kind;
23         if let ExprKind::Block(block, _) = body.kind;
24         if !block.stmts.is_empty();
25         then {
26             let mut applicability = Applicability::MachineApplicable;
27             let pat_snip = snippet_with_applicability(cx, pat.span, "..", &mut applicability);
28             let arg_snip = snippet_with_applicability(cx, arg_expression.span, "..", &mut applicability);
29             let mut block_str = snippet_with_applicability(cx, block.span, "..", &mut applicability).into_owned();
30             block_str.remove(0);
31             block_str.pop();
32             let indent = " ".repeat(indent_of(cx, block.stmts[0].span).unwrap_or(0));
33
34             span_lint_and_sugg(
35                 cx,
36                 SINGLE_ELEMENT_LOOP,
37                 expr.span,
38                 "for loop over a single element",
39                 "try",
40                 format!("{{\n{}let {} = &{};{}}}", indent, pat_snip, arg_snip, block_str),
41                 applicability,
42             )
43         }
44     }
45 }