aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/fill_match_arms.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/handlers/fill_match_arms.rs')
-rw-r--r--crates/ra_assists/src/handlers/fill_match_arms.rs44
1 files changed, 25 insertions, 19 deletions
diff --git a/crates/ra_assists/src/handlers/fill_match_arms.rs b/crates/ra_assists/src/handlers/fill_match_arms.rs
index 5b1235682..96610dbf5 100644
--- a/crates/ra_assists/src/handlers/fill_match_arms.rs
+++ b/crates/ra_assists/src/handlers/fill_match_arms.rs
@@ -8,7 +8,7 @@ use test_utils::mark;
8 8
9use crate::{ 9use crate::{
10 utils::{render_snippet, Cursor, FamousDefs}, 10 utils::{render_snippet, Cursor, FamousDefs},
11 AssistContext, AssistId, Assists, 11 AssistContext, AssistId, AssistKind, Assists,
12}; 12};
13 13
14// Assist: fill_match_arms 14// Assist: fill_match_arms
@@ -103,24 +103,30 @@ pub(crate) fn fill_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option<
103 } 103 }
104 104
105 let target = match_expr.syntax().text_range(); 105 let target = match_expr.syntax().text_range();
106 acc.add(AssistId("fill_match_arms"), "Fill match arms", target, |builder| { 106 acc.add(
107 let new_arm_list = match_arm_list.remove_placeholder(); 107 AssistId("fill_match_arms"),
108 let n_old_arms = new_arm_list.arms().count(); 108 AssistKind::RefactorRewrite,
109 let new_arm_list = new_arm_list.append_arms(missing_arms); 109 "Fill match arms",
110 let first_new_arm = new_arm_list.arms().nth(n_old_arms); 110 target,
111 let old_range = match_arm_list.syntax().text_range(); 111 |builder| {
112 match (first_new_arm, ctx.config.snippet_cap) { 112 let new_arm_list = match_arm_list.remove_placeholder();
113 (Some(first_new_arm), Some(cap)) => { 113 let n_old_arms = new_arm_list.arms().count();
114 let snippet = render_snippet( 114 let new_arm_list = new_arm_list.append_arms(missing_arms);
115 cap, 115 let first_new_arm = new_arm_list.arms().nth(n_old_arms);
116 new_arm_list.syntax(), 116 let old_range = match_arm_list.syntax().text_range();
117 Cursor::Before(first_new_arm.syntax()), 117 match (first_new_arm, ctx.config.snippet_cap) {
118 ); 118 (Some(first_new_arm), Some(cap)) => {
119 builder.replace_snippet(cap, old_range, snippet); 119 let snippet = render_snippet(
120 } 120 cap,
121 _ => builder.replace(old_range, new_arm_list.to_string()), 121 new_arm_list.syntax(),
122 } 122 Cursor::Before(first_new_arm.syntax()),
123 }) 123 );
124 builder.replace_snippet(cap, old_range, snippet);
125 }
126 _ => builder.replace(old_range, new_arm_list.to_string()),
127 }
128 },
129 )
124} 130}
125 131
126fn is_variant_missing(existing_arms: &mut Vec<MatchArm>, var: &Pat) -> bool { 132fn is_variant_missing(existing_arms: &mut Vec<MatchArm>, var: &Pat) -> bool {