Unnamed repository; edit this file 'description' to name the repository.
Wrap top level or patterns in parens in convert_match_to_let_else
I really hate the way it was done, we should improve the editor.
| -rw-r--r-- | crates/ide-assists/src/handlers/convert_match_to_let_else.rs | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/convert_match_to_let_else.rs b/crates/ide-assists/src/handlers/convert_match_to_let_else.rs index bc49acc1ef..6ff6b4b736 100644 --- a/crates/ide-assists/src/handlers/convert_match_to_let_else.rs +++ b/crates/ide-assists/src/handlers/convert_match_to_let_else.rs @@ -61,9 +61,17 @@ pub(crate) fn convert_match_to_let_else(acc: &mut Assists, ctx: &AssistContext<' |builder| { let extracting_arm_pat = rename_variable(&extracting_arm_pat, &extracted_variable_positions, pat); + let (open_paren, close_paren) = if ast::OrPat::can_cast(extracting_arm_pat.kind()) { + // Or patterns cannot put put directly under let statements. + // FIXME: Do this with `SyntaxEditor` in `rename_variable()`, it's just difficult right now + // since it re-roots nodes. + ("(", ")") + } else { + ("", "") + }; builder.replace( let_stmt.syntax().text_range(), - format!("let {extracting_arm_pat} = {initializer_expr} else {diverging_arm_expr};"), + format!("let {open_paren}{extracting_arm_pat}{close_paren} = {initializer_expr} else {diverging_arm_expr};"), ) }, ) @@ -543,4 +551,38 @@ fn f() { "#, ); } + + #[test] + fn top_level_or_pat() { + check_assist( + convert_match_to_let_else, + r#" +enum E { + A(u32), + B(u32), + C, +} + +fn foo() { + let e = E::A(0); + let _$0 = match e { + E::A(v) | E::B(v) => v, + _ => return, + }; +} + "#, + r#" +enum E { + A(u32), + B(u32), + C, +} + +fn foo() { + let e = E::A(0); + let (E::A(_) | E::B(_)) = e else { return }; +} + "#, + ); + } } |