aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_assists/src/fill_match_arms.rs56
1 files changed, 54 insertions, 2 deletions
diff --git a/crates/ra_assists/src/fill_match_arms.rs b/crates/ra_assists/src/fill_match_arms.rs
index c7a8bce20..a0e0f110f 100644
--- a/crates/ra_assists/src/fill_match_arms.rs
+++ b/crates/ra_assists/src/fill_match_arms.rs
@@ -8,13 +8,39 @@ use ra_syntax::ast::{self, AstNode};
8 8
9use crate::{AssistCtx, Assist, AssistId}; 9use crate::{AssistCtx, Assist, AssistId};
10 10
11fn is_trivial_arm(arm: &ast::MatchArm) -> bool {
12 for (i, p) in arm.pats().enumerate() {
13 if i > 0 {
14 return false;
15 }
16
17 match p.kind() {
18 ast::PatKind::PlaceholderPat(_) => {}
19 _ => {
20 return false;
21 }
22 };
23 }
24 return true;
25}
26
11pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 27pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
12 let match_expr = ctx.node_at_offset::<ast::MatchExpr>()?; 28 let match_expr = ctx.node_at_offset::<ast::MatchExpr>()?;
13 29
14 // We already have some match arms, so we don't provide any assists. 30 // We already have some match arms, so we don't provide any assists.
31 // Unless if there is only one trivial match arm possibly created
32 // by match postfix complete. Trivial match arm is the catch all arm.
15 match match_expr.match_arm_list() { 33 match match_expr.match_arm_list() {
16 Some(arm_list) if arm_list.arms().count() > 0 => { 34 Some(arm_list) => {
17 return None; 35 for (i, a) in arm_list.arms().enumerate() {
36 if i > 0 {
37 return None;
38 }
39
40 if !is_trivial_arm(a) {
41 return None;
42 }
43 }
18 } 44 }
19 _ => {} 45 _ => {}
20 } 46 }
@@ -228,4 +254,30 @@ mod tests {
228 "match E::X {}", 254 "match E::X {}",
229 ); 255 );
230 } 256 }
257
258 #[test]
259 fn fill_match_arms_trivial_arm() {
260 check_assist(
261 fill_match_arms,
262 r#"
263 enum E { X, Y }
264
265 fn main() {
266 match E::X {
267 <|>_ => {},
268 }
269 }
270 "#,
271 r#"
272 enum E { X, Y }
273
274 fn main() {
275 match <|>E::X {
276 E::X => (),
277 E::Y => (),
278 }
279 }
280 "#,
281 );
282 }
231} 283}