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::>(); 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::>(); 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