]>
Commit | Line | Data |
---|---|---|
f20569fa | 1 | use super::EXPLICIT_INTO_ITER_LOOP; |
cdc7bbd5 | 2 | use clippy_utils::diagnostics::span_lint_and_sugg; |
94222f64 | 3 | use clippy_utils::is_trait_method; |
cdc7bbd5 | 4 | use clippy_utils::source::snippet_with_applicability; |
f20569fa XL |
5 | use rustc_errors::Applicability; |
6 | use rustc_hir::Expr; | |
7 | use rustc_lint::LateContext; | |
8 | use rustc_middle::ty::TyS; | |
94222f64 | 9 | use rustc_span::symbol::sym; |
f20569fa | 10 | |
cdc7bbd5 XL |
11 | pub(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 | } |