]> git.proxmox.com Git - rustc.git/blame - src/tools/clippy/clippy_lints/src/loops/explicit_into_iter_loop.rs
New upstream version 1.56.0~beta.4+dfsg1
[rustc.git] / src / tools / clippy / clippy_lints / src / loops / explicit_into_iter_loop.rs
CommitLineData
f20569fa 1use super::EXPLICIT_INTO_ITER_LOOP;
cdc7bbd5 2use clippy_utils::diagnostics::span_lint_and_sugg;
94222f64 3use clippy_utils::is_trait_method;
cdc7bbd5 4use clippy_utils::source::snippet_with_applicability;
f20569fa
XL
5use rustc_errors::Applicability;
6use rustc_hir::Expr;
7use rustc_lint::LateContext;
8use rustc_middle::ty::TyS;
94222f64 9use rustc_span::symbol::sym;
f20569fa 10
cdc7bbd5
XL
11pub(super) fn check(cx: &LateContext<'_>, self_arg: &'hir Expr<'hir>, call_expr: &Expr<'_>) {
12 let self_ty = cx.typeck_results().expr_ty(self_arg);
13 let self_ty_adjusted = cx.typeck_results().expr_ty_adjusted(self_arg);
94222f64 14 if !(TyS::same_type(self_ty, self_ty_adjusted) && is_trait_method(cx, call_expr, sym::IntoIterator)) {
f20569fa
XL
15 return;
16 }
17
18 let mut applicability = Applicability::MachineApplicable;
cdc7bbd5 19 let object = snippet_with_applicability(cx, self_arg.span, "_", &mut applicability);
f20569fa
XL
20 span_lint_and_sugg(
21 cx,
22 EXPLICIT_INTO_ITER_LOOP,
cdc7bbd5 23 call_expr.span,
f20569fa
XL
24 "it is more concise to loop over containers instead of using explicit \
25 iteration methods",
26 "to write this more concisely, try",
27 object.to_string(),
28 applicability,
29 );
30}