From 9d1f824878b08f7ad631b21b2c8bf42522af65c0 Mon Sep 17 00:00:00 2001 From: Yuxiang Qiu Date: Thu, 4 Jan 2024 20:29:41 -0500 Subject: [PATCH] fix: check if receiver's hir_id matches expr's hir_id --- clippy_lints/src/methods/search_is_some.rs | 3 ++- tests/ui/search_is_some_fixable_none.fixed | 9 +++++++++ tests/ui/search_is_some_fixable_none.rs | 9 +++++++++ tests/ui/search_is_some_fixable_none.stderr | 12 +++++++++--- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/clippy_lints/src/methods/search_is_some.rs b/clippy_lints/src/methods/search_is_some.rs index 1ea2e93c9de64..1e1a8f9060ba9 100644 --- a/clippy_lints/src/methods/search_is_some.rs +++ b/clippy_lints/src/methods/search_is_some.rs @@ -159,7 +159,8 @@ pub(super) fn check<'tcx>( fn is_receiver_of_method_call(cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> bool { if let Some(parent_expr) = get_parent_expr(cx, expr) - && let ExprKind::MethodCall(..) = parent_expr.kind + && let ExprKind::MethodCall(_, receiver, ..) = parent_expr.kind + && receiver.hir_id == expr.hir_id { return true; } diff --git a/tests/ui/search_is_some_fixable_none.fixed b/tests/ui/search_is_some_fixable_none.fixed index 3e5b3fab5ffdd..e5c540e67237c 100644 --- a/tests/ui/search_is_some_fixable_none.fixed +++ b/tests/ui/search_is_some_fixable_none.fixed @@ -219,6 +219,13 @@ mod issue_11910 { 0 } + struct Foo; + impl Foo{ + fn bar(&self, _ : bool) { + + } + } + fn test_then() { let v = vec![3, 2, 1, 0, -1, -2, -3]; (!v.iter().any(|x| *x == 42)).then(computations); @@ -227,5 +234,7 @@ mod issue_11910 { fn test_then_some() { let v = vec![3, 2, 1, 0, -1, -2, -3]; (!v.iter().any(|x| *x == 42)).then_some(0); + + Foo.bar(!v.iter().any(|x| *x == 42)); } } diff --git a/tests/ui/search_is_some_fixable_none.rs b/tests/ui/search_is_some_fixable_none.rs index e77ae5cecc26a..aeb2be168f363 100644 --- a/tests/ui/search_is_some_fixable_none.rs +++ b/tests/ui/search_is_some_fixable_none.rs @@ -225,6 +225,13 @@ mod issue_11910 { 0 } + struct Foo; + impl Foo{ + fn bar(&self, _ : bool) { + + } + } + fn test_then() { let v = vec![3, 2, 1, 0, -1, -2, -3]; v.iter().find(|x| **x == 42).is_none().then(computations); @@ -233,5 +240,7 @@ mod issue_11910 { fn test_then_some() { let v = vec![3, 2, 1, 0, -1, -2, -3]; v.iter().find(|x| **x == 42).is_none().then_some(0); + + Foo.bar(v.iter().find(|x| **x == 42).is_none()); } } diff --git a/tests/ui/search_is_some_fixable_none.stderr b/tests/ui/search_is_some_fixable_none.stderr index 240eb245cdddd..61a1f996d6564 100644 --- a/tests/ui/search_is_some_fixable_none.stderr +++ b/tests/ui/search_is_some_fixable_none.stderr @@ -283,16 +283,22 @@ LL | let _ = v.iter().find(|fp| test_u32_2(*fp.field)).is_none(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `!v.iter().any(|fp| test_u32_2(*fp.field))` error: called `is_none()` after searching an `Iterator` with `find` - --> $DIR/search_is_some_fixable_none.rs:230:9 + --> $DIR/search_is_some_fixable_none.rs:237:9 | LL | v.iter().find(|x| **x == 42).is_none().then(computations); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `!_.any()` instead: `(!v.iter().any(|x| *x == 42))` error: called `is_none()` after searching an `Iterator` with `find` - --> $DIR/search_is_some_fixable_none.rs:235:9 + --> $DIR/search_is_some_fixable_none.rs:242:9 | LL | v.iter().find(|x| **x == 42).is_none().then_some(0); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `!_.any()` instead: `(!v.iter().any(|x| *x == 42))` -error: aborting due to 45 previous errors +error: called `is_none()` after searching an `Iterator` with `find` + --> $DIR/search_is_some_fixable_none.rs:244:17 + | +LL | Foo.bar(v.iter().find(|x| **x == 42).is_none()); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `!_.any()` instead: `!v.iter().any(|x| *x == 42)` + +error: aborting due to 46 previous errors