aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/merge_match_arms.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/handlers/merge_match_arms.rs')
-rw-r--r--crates/ra_assists/src/handlers/merge_match_arms.rs46
1 files changed, 26 insertions, 20 deletions
diff --git a/crates/ra_assists/src/handlers/merge_match_arms.rs b/crates/ra_assists/src/handlers/merge_match_arms.rs
index 90ce66378..f0f11a046 100644
--- a/crates/ra_assists/src/handlers/merge_match_arms.rs
+++ b/crates/ra_assists/src/handlers/merge_match_arms.rs
@@ -6,7 +6,7 @@ use ra_syntax::{
6 Direction, 6 Direction,
7}; 7};
8 8
9use crate::{AssistContext, AssistId, Assists, TextRange}; 9use crate::{AssistContext, AssistId, AssistKind, Assists, TextRange};
10 10
11// Assist: merge_match_arms 11// Assist: merge_match_arms
12// 12//
@@ -59,25 +59,31 @@ pub(crate) fn merge_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option
59 return None; 59 return None;
60 } 60 }
61 61
62 acc.add(AssistId("merge_match_arms"), "Merge match arms", current_text_range, |edit| { 62 acc.add(
63 let pats = if arms_to_merge.iter().any(contains_placeholder) { 63 AssistId("merge_match_arms"),
64 "_".into() 64 AssistKind::RefactorRewrite,
65 } else { 65 "Merge match arms",
66 arms_to_merge 66 current_text_range,
67 .iter() 67 |edit| {
68 .filter_map(ast::MatchArm::pat) 68 let pats = if arms_to_merge.iter().any(contains_placeholder) {
69 .map(|x| x.syntax().to_string()) 69 "_".into()
70 .collect::<Vec<String>>() 70 } else {
71 .join(" | ") 71 arms_to_merge
72 }; 72 .iter()
73 73 .filter_map(ast::MatchArm::pat)
74 let arm = format!("{} => {}", pats, current_expr.syntax().text()); 74 .map(|x| x.syntax().to_string())
75 75 .collect::<Vec<String>>()
76 let start = arms_to_merge.first().unwrap().syntax().text_range().start(); 76 .join(" | ")
77 let end = arms_to_merge.last().unwrap().syntax().text_range().end(); 77 };
78 78
79 edit.replace(TextRange::new(start, end), arm); 79 let arm = format!("{} => {}", pats, current_expr.syntax().text());
80 }) 80
81 let start = arms_to_merge.first().unwrap().syntax().text_range().start();
82 let end = arms_to_merge.last().unwrap().syntax().text_range().end();
83
84 edit.replace(TextRange::new(start, end), arm);
85 },
86 )
81} 87}
82 88
83fn contains_placeholder(a: &ast::MatchArm) -> bool { 89fn contains_placeholder(a: &ast::MatchArm) -> bool {