From 888157b52eace7a4dbf4138ad48926a78ed1d0e1 Mon Sep 17 00:00:00 2001 From: ironyman Date: Sun, 23 Jun 2019 21:05:50 -0700 Subject: fill_match_arm works with trivial arm --- crates/ra_assists/src/fill_match_arms.rs | 56 ++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'crates/ra_assists/src') 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}; use crate::{AssistCtx, Assist, AssistId}; +fn is_trivial_arm(arm: &ast::MatchArm) -> bool { + for (i, p) in arm.pats().enumerate() { + if i > 0 { + return false; + } + + match p.kind() { + ast::PatKind::PlaceholderPat(_) => {} + _ => { + return false; + } + }; + } + return true; +} + pub(crate) fn fill_match_arms(mut ctx: AssistCtx) -> Option { let match_expr = ctx.node_at_offset::()?; // We already have some match arms, so we don't provide any assists. + // Unless if there is only one trivial match arm possibly created + // by match postfix complete. Trivial match arm is the catch all arm. match match_expr.match_arm_list() { - Some(arm_list) if arm_list.arms().count() > 0 => { - return None; + Some(arm_list) => { + for (i, a) in arm_list.arms().enumerate() { + if i > 0 { + return None; + } + + if !is_trivial_arm(a) { + return None; + } + } } _ => {} } @@ -228,4 +254,30 @@ mod tests { "match E::X {}", ); } + + #[test] + fn fill_match_arms_trivial_arm() { + check_assist( + fill_match_arms, + r#" + enum E { X, Y } + + fn main() { + match E::X { + <|>_ => {}, + } + } + "#, + r#" + enum E { X, Y } + + fn main() { + match <|>E::X { + E::X => (), + E::Y => (), + } + } + "#, + ); + } } -- cgit v1.2.3