From 8072f1aac553effdb14760989b71149315eede99 Mon Sep 17 00:00:00 2001 From: A4-Tacks Date: Tue, 6 Jan 2026 17:46:00 +0800 Subject: [PATCH] Fix not applicable on ambiguous ident pat for merge_match_arms Example --- ```rust enum X { A, B, C, } use X::*; fn main() { match A { $0A => todo!(), B => todo!(), C => todo!(), } } ``` **Before this PR** Assist not applicable **After this PR** ```rust enum X { A, B, C, } use X::*; fn main() { match A { A | B => todo!(), C => todo!(), } } ``` --- .../src/handlers/merge_match_arms.rs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) 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(