Auto merge of #4049 - airt:fix-4033-search_is_some, r=flip1995
Fix #4033 search_is_some Fixes #4033. Suggest `any(|x| ..)` instead of `any(|&x| ..)` for `find(|&x| ..).is_some()` (Lint [search_is_some](https://rust-lang.github.io/rust-clippy/master/index.html#search_is_some)) FnDecl of `find`: ```rust fn find<P>(&mut self, mut p: P) -> Option<Self::Item> where P: FnMut(&Self::Item) -> bool ``` FnDecl of `any`: ```rust fn any<F>(&mut self, mut f: F) -> bool where F: FnMut(Self::Item) -> bool ``` If match on `|&_|` in closure of `find`, only use `|_|` in the suggestion. PS. It's the first time that I have used the `hir` API, please correct me if there is any mistake 😺
This commit is contained in:
commit
8151a17422
@ -2059,6 +2059,19 @@ fn lint_search_is_some<'a, 'tcx>(
|
|||||||
);
|
);
|
||||||
let search_snippet = snippet(cx, search_args[1].span, "..");
|
let search_snippet = snippet(cx, search_args[1].span, "..");
|
||||||
if search_snippet.lines().count() <= 1 {
|
if search_snippet.lines().count() <= 1 {
|
||||||
|
// suggest `any(|x| ..)` instead of `any(|&x| ..)` for `find(|&x| ..).is_some()`
|
||||||
|
let any_search_snippet = if_chain! {
|
||||||
|
if search_method == "find";
|
||||||
|
if let hir::ExprKind::Closure(_, _, body_id, ..) = search_args[1].node;
|
||||||
|
let closure_body = cx.tcx.hir().body(body_id);
|
||||||
|
if let Some(closure_arg) = closure_body.arguments.get(0);
|
||||||
|
if let hir::PatKind::Ref(..) = closure_arg.pat.node;
|
||||||
|
then {
|
||||||
|
Some(search_snippet.replacen('&', "", 1))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
// add note if not multi-line
|
// add note if not multi-line
|
||||||
span_note_and_lint(
|
span_note_and_lint(
|
||||||
cx,
|
cx,
|
||||||
@ -2067,8 +2080,10 @@ fn lint_search_is_some<'a, 'tcx>(
|
|||||||
&msg,
|
&msg,
|
||||||
expr.span,
|
expr.span,
|
||||||
&format!(
|
&format!(
|
||||||
"replace `{0}({1}).is_some()` with `any({1})`",
|
"replace `{0}({1}).is_some()` with `any({2})`",
|
||||||
search_method, search_snippet
|
search_method,
|
||||||
|
search_snippet,
|
||||||
|
any_search_snippet.as_ref().map_or(&*search_snippet, String::as_str)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
@ -155,7 +155,7 @@ LL | let _ = v.iter().find(|&x| *x < 0).is_some();
|
|||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: `-D clippy::search-is-some` implied by `-D warnings`
|
= note: `-D clippy::search-is-some` implied by `-D warnings`
|
||||||
= note: replace `find(|&x| *x < 0).is_some()` with `any(|&x| *x < 0)`
|
= note: replace `find(|&x| *x < 0).is_some()` with `any(|x| *x < 0)`
|
||||||
|
|
||||||
error: called `is_some()` after searching an `Iterator` with find. This is more succinctly expressed by calling `any()`.
|
error: called `is_some()` after searching an `Iterator` with find. This is more succinctly expressed by calling `any()`.
|
||||||
--> $DIR/methods.rs:236:13
|
--> $DIR/methods.rs:236:13
|
||||||
|
Loading…
Reference in New Issue
Block a user