Skip to content

Commit 5f8f8a3

Browse files
committed
Don't show assist if all arms are present
1 parent 6087c01 commit 5f8f8a3

File tree

1 file changed

+37
-33
lines changed

1 file changed

+37
-33
lines changed

crates/ra_assists/src/handlers/fill_match_arms.rs

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,45 +50,49 @@ pub(crate) fn fill_match_arms(ctx: AssistCtx) -> Option<Assist> {
5050
return None;
5151
}
5252

53-
let db = ctx.db;
54-
ctx.add_assist(AssistId("fill_match_arms"), "Fill match arms", |edit| {
55-
let mut arms: Vec<MatchArm> = match_arm_list.arms().collect();
56-
if arms.len() == 1 {
57-
if let Some(Pat::PlaceholderPat(..)) = arms[0].pat() {
58-
arms.clear();
59-
}
53+
let mut arms: Vec<MatchArm> = match_arm_list.arms().collect();
54+
if arms.len() == 1 {
55+
if let Some(Pat::PlaceholderPat(..)) = arms[0].pat() {
56+
arms.clear();
6057
}
58+
}
6159

62-
let mut has_partial_match = false;
63-
let variants: Vec<MatchArm> = variants
64-
.into_iter()
65-
.filter_map(|variant| build_pat(db, module, variant))
66-
.filter(|variant_pat| {
67-
!arms.iter().filter_map(|arm| arm.pat().map(|_| arm)).any(|arm| {
68-
let pat = arm.pat().unwrap();
69-
70-
// Special casee OrPat as separate top-level pats
71-
let pats: Vec<Pat> = match Pat::from(pat.clone()) {
72-
Pat::OrPat(pats) => pats.pats().collect::<Vec<_>>(),
73-
_ => vec![pat],
74-
};
75-
76-
pats.iter().any(|pat| {
77-
match does_arm_pat_match_variant(pat, arm.guard(), variant_pat) {
78-
ArmMatch::Yes => true,
79-
ArmMatch::No => false,
80-
ArmMatch::Partial => {
81-
has_partial_match = true;
82-
true
83-
}
60+
let mut has_partial_match = false;
61+
let db = ctx.db;
62+
let missing_arms: Vec<MatchArm> = variants
63+
.into_iter()
64+
.filter_map(|variant| build_pat(db, module, variant))
65+
.filter(|variant_pat| {
66+
!arms.iter().filter_map(|arm| arm.pat().map(|_| arm)).any(|arm| {
67+
let pat = arm.pat().unwrap();
68+
69+
// Special casee OrPat as separate top-level pats
70+
let pats: Vec<Pat> = match Pat::from(pat.clone()) {
71+
Pat::OrPat(pats) => pats.pats().collect::<Vec<_>>(),
72+
_ => vec![pat],
73+
};
74+
75+
pats.iter().any(|pat| {
76+
match does_arm_pat_match_variant(pat, arm.guard(), variant_pat) {
77+
ArmMatch::Yes => true,
78+
ArmMatch::No => false,
79+
ArmMatch::Partial => {
80+
has_partial_match = true;
81+
true
8482
}
85-
})
83+
}
8684
})
8785
})
88-
.map(|pat| make::match_arm(iter::once(pat), make::expr_unit()))
89-
.collect();
86+
})
87+
.map(|pat| make::match_arm(iter::once(pat), make::expr_unit()))
88+
.collect();
9089

91-
arms.extend(variants);
90+
if missing_arms.is_empty() && !has_partial_match {
91+
return None;
92+
}
93+
94+
ctx.add_assist(AssistId("fill_match_arms"), "Fill match arms", |edit| {
95+
arms.extend(missing_arms);
9296
if has_partial_match {
9397
arms.push(make::match_arm(
9498
iter::once(make::placeholder_pat().into()),

0 commit comments

Comments
 (0)