]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/filter_map_identity.rs
Rollup merge of #84262 - camelid:sized-ice, r=estebank
[rust.git] / src / tools / clippy / clippy_lints / src / methods / filter_map_identity.rs
1 use clippy_utils::diagnostics::span_lint_and_sugg;
2 use clippy_utils::{is_expr_path_def_path, is_trait_method, path_to_local_id, paths};
3 use if_chain::if_chain;
4 use rustc_errors::Applicability;
5 use rustc_hir as hir;
6 use rustc_lint::LateContext;
7 use rustc_span::{source_map::Span, sym};
8
9 use super::FILTER_MAP_IDENTITY;
10
11 pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, filter_map_arg: &hir::Expr<'_>, filter_map_span: Span) {
12     if is_trait_method(cx, expr, sym::Iterator) {
13         let apply_lint = |message: &str| {
14             span_lint_and_sugg(
15                 cx,
16                 FILTER_MAP_IDENTITY,
17                 filter_map_span.with_hi(expr.span.hi()),
18                 message,
19                 "try",
20                 "flatten()".to_string(),
21                 Applicability::MachineApplicable,
22             );
23         };
24
25         if_chain! {
26             if let hir::ExprKind::Closure(_, _, body_id, _, _) = filter_map_arg.kind;
27             let body = cx.tcx.hir().body(body_id);
28
29             if let hir::PatKind::Binding(_, binding_id, ..) = body.params[0].pat.kind;
30             if path_to_local_id(&body.value, binding_id);
31             then {
32                 apply_lint("called `filter_map(|x| x)` on an `Iterator`");
33             }
34         }
35
36         if is_expr_path_def_path(cx, filter_map_arg, &paths::CONVERT_IDENTITY) {
37             apply_lint("called `filter_map(std::convert::identity)` on an `Iterator`");
38         }
39     }
40 }