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;
9 pub(super) fn check<'tcx>(
10 cx: &LateContext<'tcx>,
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,
22 if let ExprKind::Array([arg_expression]) = arg_expr.kind;
23 if let ExprKind::Block(block, _) = body.kind;
24 if !block.stmts.is_empty();
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();
32 let indent = " ".repeat(indent_of(cx, block.stmts[0].span).unwrap_or(0));
38 "for loop over a single element",
40 format!("{{\n{}let {} = &{};{}}}", indent, pat_snip, arg_snip, block_str),