diff --git a/crates/ide-assists/src/handlers/merge_match_arms.rs b/crates/ide-assists/src/handlers/merge_match_arms.rs index 08170f81b283..52bb8e36fa0b 100644 --- a/crates/ide-assists/src/handlers/merge_match_arms.rs +++ b/crates/ide-assists/src/handlers/merge_match_arms.rs @@ -160,9 +160,14 @@ fn get_arm_types<'db>( } } ast::Pat::IdentPat(ident_pat) => { + let has_type = ctx.sema.type_of_pat(local_pat).is_some(); if let Some(name) = ident_pat.name() { let pat_type = ctx.sema.type_of_binding_in_pat(ident_pat); - map.insert(name.text().to_string(), pat_type); + let is_local_variable = !has_type || pat_type.is_some(); + + if is_local_variable { + map.insert(name.text().to_string(), pat_type); + } } } _ => (), @@ -212,6 +217,40 @@ fn main() { ); } + #[test] + fn merge_match_arms_ambiguous_ident_patterns() { + check_assist( + merge_match_arms, + r#" +#[derive(Debug)] +enum X { A, B, C } +use X::*; + +fn main() { + let x = A; + let y = match x { + A => { 1i32$0 } + B => { 1i32 } + C => { 2i32 } + } +} +"#, + r#" +#[derive(Debug)] +enum X { A, B, C } +use X::*; + +fn main() { + let x = A; + let y = match x { + A | B => { 1i32 }, + C => { 2i32 } + } +} +"#, + ); + } + #[test] fn merge_match_arms_multiple_patterns() { check_assist(