Skip to content

Commit f027f2c

Browse files
committed
add parens around suggestion if additional methods
1 parent 9f53cf3 commit f027f2c

File tree

4 files changed

+34
-14
lines changed

4 files changed

+34
-14
lines changed

clippy_lints/src/methods/unnecessary_map_or.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use clippy_config::msrvs::{self, Msrv};
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::eager_or_lazy::switch_to_eager_eval;
4-
use clippy_utils::path_to_local_id;
54
use clippy_utils::source::snippet;
65
use clippy_utils::ty::is_type_diagnostic_item;
76
use clippy_utils::visitors::is_local_used;
7+
use clippy_utils::{get_parent_expr, path_to_local_id};
8+
use rustc_ast::util::parser::AssocOp;
89
use rustc_ast::LitKind::Bool;
910
use rustc_errors::Applicability;
1011
use rustc_hir::{BinOpKind, Expr, ExprKind, PatKind};
@@ -52,13 +53,22 @@ pub(super) fn check(
5253
};
5354
let comparator = if BinOpKind::Eq == op.node { "==" } else { "!=" };
5455

56+
// we may need to add parens around the suggestion
57+
// in case the parent expression has additional method calls,
58+
// since for example `Some(5).map_or(false, |x| x == 5).then(|| 1)`
59+
// being converted to `Some(5) == Some(5).then(|| 1)` isnt
60+
// the same thing
61+
let should_add_parens = get_parent_expr(cx, expr)
62+
.is_some_and(|expr| expr.precedence().order() > AssocOp::Equal.precedence() as i8);
5563
(
5664
format!(
57-
"{} {} {}({})",
65+
"{}{} {} {}({}){}",
66+
if should_add_parens { "(" } else { "" },
5867
snippet(cx, recv.span, ".."),
5968
comparator,
6069
wrap,
61-
snippet(cx, non_binding_location.span.source_callsite(), "..")
70+
snippet(cx, non_binding_location.span.source_callsite(), ".."),
71+
if should_add_parens { ")" } else { "" }
6272
),
6373
"standard comparison",
6474
)

tests/ui/unnecessary_map_or.fixed

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![warn(clippy::unnecessary_map_or)]
22
#![allow(clippy::no_effect)]
33
#![allow(clippy::eq_op)]
4+
#[allow(clippy::unnecessary_lazy_evaluations)]
45

56
#[clippy::msrv = "1.70.0"]
67
fn main() {
@@ -18,6 +19,7 @@ fn main() {
1819
let _ = Some(5).is_some_and(|n| n == if 2 > 1 { n } else { 0 });
1920
let _ = Ok::<Vec<i32>, i32>(vec![5]).is_ok_and(|n| n == [5]);
2021
let _ = Ok::<i32, i32>(5) == Ok(5);
22+
let _ = (Some(5) == Some(5)).then(|| 1);
2123

2224
// shouldnt trigger
2325
let _ = Some(5).map_or(true, |n| n == 5);

tests/ui/unnecessary_map_or.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![warn(clippy::unnecessary_map_or)]
22
#![allow(clippy::no_effect)]
33
#![allow(clippy::eq_op)]
4+
#[allow(clippy::unnecessary_lazy_evaluations)]
45

56
#[clippy::msrv = "1.70.0"]
67
fn main() {
@@ -21,6 +22,7 @@ fn main() {
2122
let _ = Some(5).map_or(false, |n| n == if 2 > 1 { n } else { 0 });
2223
let _ = Ok::<Vec<i32>, i32>(vec![5]).map_or(false, |n| n == [5]);
2324
let _ = Ok::<i32, i32>(5).map_or(false, |n| n == 5);
25+
let _ = Some(5).map_or(false, |n| n == 5).then(|| 1);
2426

2527
// shouldnt trigger
2628
let _ = Some(5).map_or(true, |n| n == 5);

tests/ui/unnecessary_map_or.stderr

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: `map_or` is redundant, use standard comparison instead
2-
--> $DIR/unnecessary_map_or.rs:8:13
2+
--> $DIR/unnecessary_map_or.rs:9:13
33
|
44
LL | let _ = Some(5).map_or(false, |n| n == 5);
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(5) == Some(5)`
@@ -8,13 +8,13 @@ LL | let _ = Some(5).map_or(false, |n| n == 5);
88
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_map_or)]`
99

1010
error: `map_or` is redundant, use standard comparison instead
11-
--> $DIR/unnecessary_map_or.rs:9:13
11+
--> $DIR/unnecessary_map_or.rs:10:13
1212
|
1313
LL | let _ = Some(5).map_or(true, |n| n != 5);
1414
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(5) != Some(5)`
1515

1616
error: `map_or` is redundant, use standard comparison instead
17-
--> $DIR/unnecessary_map_or.rs:10:13
17+
--> $DIR/unnecessary_map_or.rs:11:13
1818
|
1919
LL | let _ = Some(5).map_or(false, |n| {
2020
| _____________^
@@ -24,7 +24,7 @@ LL | | });
2424
| |______^ help: try: `Some(5) == Some(5)`
2525

2626
error: `map_or` is redundant, use is_some_and instead
27-
--> $DIR/unnecessary_map_or.rs:14:13
27+
--> $DIR/unnecessary_map_or.rs:15:13
2828
|
2929
LL | let _ = Some(5).map_or(false, |n| {
3030
| _____________^
@@ -42,40 +42,46 @@ LL ~ });
4242
|
4343

4444
error: `map_or` is redundant, use is_some_and instead
45-
--> $DIR/unnecessary_map_or.rs:18:13
45+
--> $DIR/unnecessary_map_or.rs:19:13
4646
|
4747
LL | let _ = Some(vec![5]).map_or(false, |n| n == [5]);
4848
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(vec![5]).is_some_and(|n| n == [5])`
4949

5050
error: `map_or` is redundant, use is_some_and instead
51-
--> $DIR/unnecessary_map_or.rs:19:13
51+
--> $DIR/unnecessary_map_or.rs:20:13
5252
|
5353
LL | let _ = Some(vec![1]).map_or(false, |n| vec![2] == n);
5454
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(vec![1]).is_some_and(|n| vec![2] == n)`
5555

5656
error: `map_or` is redundant, use is_some_and instead
57-
--> $DIR/unnecessary_map_or.rs:20:13
57+
--> $DIR/unnecessary_map_or.rs:21:13
5858
|
5959
LL | let _ = Some(5).map_or(false, |n| n == n);
6060
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(5).is_some_and(|n| n == n)`
6161

6262
error: `map_or` is redundant, use is_some_and instead
63-
--> $DIR/unnecessary_map_or.rs:21:13
63+
--> $DIR/unnecessary_map_or.rs:22:13
6464
|
6565
LL | let _ = Some(5).map_or(false, |n| n == if 2 > 1 { n } else { 0 });
6666
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Some(5).is_some_and(|n| n == if 2 > 1 { n } else { 0 })`
6767

6868
error: `map_or` is redundant, use is_ok_and instead
69-
--> $DIR/unnecessary_map_or.rs:22:13
69+
--> $DIR/unnecessary_map_or.rs:23:13
7070
|
7171
LL | let _ = Ok::<Vec<i32>, i32>(vec![5]).map_or(false, |n| n == [5]);
7272
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Ok::<Vec<i32>, i32>(vec![5]).is_ok_and(|n| n == [5])`
7373

7474
error: `map_or` is redundant, use standard comparison instead
75-
--> $DIR/unnecessary_map_or.rs:23:13
75+
--> $DIR/unnecessary_map_or.rs:24:13
7676
|
7777
LL | let _ = Ok::<i32, i32>(5).map_or(false, |n| n == 5);
7878
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Ok::<i32, i32>(5) == Ok(5)`
7979

80-
error: aborting due to 10 previous errors
80+
error: `map_or` is redundant, use standard comparison instead
81+
--> $DIR/unnecessary_map_or.rs:25:13
82+
|
83+
LL | let _ = Some(5).map_or(false, |n| n == 5).then(|| 1);
84+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(Some(5) == Some(5))`
85+
86+
error: aborting due to 11 previous errors
8187

0 commit comments

Comments
 (0)