about summary refs log tree commit diff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2023-06-01 18:55:24 +0200
committerest31 <MTest31@outlook.com>2023-06-01 18:55:24 +0200
commit0a7366897d35c0dd2ea125fe79e43cb4862dc73b (patch)
treec4da69d267a1337dc277bb653c07fed881c1fca4
parent652b4c720dd613270f4755c39fa77d4d686187be (diff)
downloadrust-0a7366897d35c0dd2ea125fe79e43cb4862dc73b.tar.gz
rust-0a7366897d35c0dd2ea125fe79e43cb4862dc73b.zip
manual_let_else: only add () around PatKind::Or at the top level
At the top level, () are required, but on the levels below they are not.
-rw-r--r--clippy_lints/src/manual_let_else.rs13
-rw-r--r--tests/ui/manual_let_else_match.rs5
-rw-r--r--tests/ui/manual_let_else_match.stderr13
3 files changed, 25 insertions, 6 deletions
diff --git a/clippy_lints/src/manual_let_else.rs b/clippy_lints/src/manual_let_else.rs
index 389b0a4a62d..d5e847e7183 100644
--- a/clippy_lints/src/manual_let_else.rs
+++ b/clippy_lints/src/manual_let_else.rs
@@ -159,7 +159,7 @@ fn emit_manual_let_else(
             } else {
                 format!("{{ {sn_else} }}")
             };
-            let sn_bl = replace_in_pattern(cx, span, local, pat, &mut app);
+            let sn_bl = replace_in_pattern(cx, span, local, pat, &mut app, true);
             let sugg = format!("let {sn_bl} = {sn_expr} else {else_bl};");
             diag.span_suggestion(span, "consider writing", sugg, app);
         },
@@ -173,6 +173,7 @@ fn replace_in_pattern(
     local: &Pat<'_>,
     pat: &Pat<'_>,
     app: &mut Applicability,
+    top_level: bool,
 ) -> String {
     let mut bindings_count = 0;
     pat.each_binding_or_first(&mut |_, _, _, _| bindings_count += 1);
@@ -191,16 +192,20 @@ fn replace_in_pattern(
         PatKind::Or(pats) => {
             let patterns = pats
                 .iter()
-                .map(|pat| replace_in_pattern(cx, span, local, pat, app))
+                .map(|pat| replace_in_pattern(cx, span, local, pat, app, false))
                 .collect::<Vec<_>>();
             let or_pat = patterns.join(" | ");
-            return format!("({or_pat})");
+            if top_level {
+                return format!("({or_pat})");
+            } else {
+                return or_pat;
+            }
         },
         // Replace the variable name iff `TupleStruct` has one argument like `Variant(v)`.
         PatKind::TupleStruct(ref w, args, dot_dot_pos) => {
             let mut args = args
                 .iter()
-                .map(|pat| replace_in_pattern(cx, span, local, pat, app))
+                .map(|pat| replace_in_pattern(cx, span, local, pat, app, false))
                 .collect::<Vec<_>>();
             if let Some(pos) = dot_dot_pos.as_opt_usize() {
                 args.insert(pos, "..".to_owned());
diff --git a/tests/ui/manual_let_else_match.rs b/tests/ui/manual_let_else_match.rs
index dfca3b023cd..07cd5a53a7c 100644
--- a/tests/ui/manual_let_else_match.rs
+++ b/tests/ui/manual_let_else_match.rs
@@ -72,6 +72,11 @@ fn fire() {
         _ => return,
     };
 
+    let _value = match Some(build_enum()) {
+        Some(Variant::Bar(v) | Variant::Baz(v)) => v,
+        _ => return,
+    };
+
     let data = [1_u8, 2, 3, 4, 0, 0, 0, 0];
     let data = match data.as_slice() {
         [data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0] => data,
diff --git a/tests/ui/manual_let_else_match.stderr b/tests/ui/manual_let_else_match.stderr
index 13ed35bc1d5..ead2f28e609 100644
--- a/tests/ui/manual_let_else_match.stderr
+++ b/tests/ui/manual_let_else_match.stderr
@@ -64,7 +64,16 @@ LL | |     };
    | |______^ help: consider writing: `let (Variant::Bar(_value) | Variant::Baz(_value)) = f else { return };`
 
 error: this could be rewritten as `let...else`
-  --> $DIR/manual_let_else_match.rs:76:5
+  --> $DIR/manual_let_else_match.rs:75:5
+   |
+LL | /     let _value = match Some(build_enum()) {
+LL | |         Some(Variant::Bar(v) | Variant::Baz(v)) => v,
+LL | |         _ => return,
+LL | |     };
+   | |______^ help: consider writing: `let Some(Variant::Bar(_value) | Variant::Baz(_value)) = Some(build_enum()) else { return };`
+
+error: this could be rewritten as `let...else`
+  --> $DIR/manual_let_else_match.rs:81:5
    |
 LL | /     let data = match data.as_slice() {
 LL | |         [data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0] => data,
@@ -72,5 +81,5 @@ LL | |         _ => return,
 LL | |     };
    | |______^ help: consider writing: `let ([data @ .., 0, 0, 0, 0] | [data @ .., 0, 0] | [data @ .., 0]) = data.as_slice() else { return };`
 
-error: aborting due to 8 previous errors
+error: aborting due to 9 previous errors