Skip to content

Commit

Permalink
Fix unnecessary_filter_map false positive
Browse files Browse the repository at this point in the history
  • Loading branch information
camsteffen committed May 5, 2021
1 parent a8f28b6 commit d66d373
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 18 deletions.
40 changes: 22 additions & 18 deletions clippy_lints/src/methods/unnecessary_filter_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
use rustc_hir::LangItem::{OptionNone, OptionSome};
use rustc_lint::LateContext;
use rustc_middle::hir::map::Map;
use rustc_middle::ty::{self, TyS};
use rustc_span::sym;

use super::UNNECESSARY_FILTER_MAP;
Expand All @@ -28,25 +29,28 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::Expr<
found_mapping |= return_visitor.found_mapping;
found_filtering |= return_visitor.found_filtering;

if !found_filtering {
span_lint(
cx,
UNNECESSARY_FILTER_MAP,
expr.span,
"this `.filter_map` can be written more simply using `.map`",
);
return;
}

if !found_mapping && !mutates_arg {
span_lint(
cx,
UNNECESSARY_FILTER_MAP,
expr.span,
"this `.filter_map` can be written more simply using `.filter`",
);
let sugg = if !found_filtering {
"map"
} else if !found_mapping && !mutates_arg {
let in_ty = cx.typeck_results().node_type(body.params[0].hir_id);
match cx.typeck_results().expr_ty(&body.value).kind() {
ty::Adt(adt, subst)
if cx.tcx.is_diagnostic_item(sym::option_type, adt.did)
&& TyS::same_type(in_ty, subst.type_at(0)) =>
{
"filter"
},
_ => return,
}
} else {
return;
}
};
span_lint(
cx,
UNNECESSARY_FILTER_MAP,
expr.span,
&format!("this `.filter_map` can be written more simply using `.{}`", sugg),
);
}
}

Expand Down
4 changes: 4 additions & 0 deletions tests/ui/unnecessary_filter_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@ fn main() {

let _ = (0..4).filter_map(i32::checked_abs);
}

fn filter_map_none_changes_item_type() -> impl Iterator<Item = bool> {
"".chars().filter_map(|_| None)
}

0 comments on commit d66d373

Please sign in to comment.