1 use crate::utils::{match_qpath, match_trait_method, path_to_local_id, paths, span_lint_and_sugg};
2 use if_chain::if_chain;
3 use rustc_errors::Applicability;
5 use rustc_lint::LateContext;
6 use rustc_span::source_map::Span;
8 use super::FILTER_MAP_IDENTITY;
13 filter_map_args: &[hir::Expr<'_>],
14 filter_map_span: Span,
16 if match_trait_method(cx, expr, &paths::ITERATOR) {
17 let arg_node = &filter_map_args[1].kind;
19 let apply_lint = |message: &str| {
23 filter_map_span.with_hi(expr.span.hi()),
26 "flatten()".to_string(),
27 Applicability::MachineApplicable,
32 if let hir::ExprKind::Closure(_, _, body_id, _, _) = arg_node;
33 let body = cx.tcx.hir().body(*body_id);
35 if let hir::PatKind::Binding(_, binding_id, ..) = body.params[0].pat.kind;
36 if path_to_local_id(&body.value, binding_id);
38 apply_lint("called `filter_map(|x| x)` on an `Iterator`");
43 if let hir::ExprKind::Path(ref qpath) = arg_node;
45 if match_qpath(qpath, &paths::STD_CONVERT_IDENTITY);
48 apply_lint("called `filter_map(std::convert::identity)` on an `Iterator`");