From 2fe6e23138d990a852a59d9680847cb6718565bb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Mar 2020 14:52:20 +0200 Subject: When adding match arm, don't let the floating comma --- crates/ra_syntax/src/ast/edit.rs | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'crates/ra_syntax/src') diff --git a/crates/ra_syntax/src/ast/edit.rs b/crates/ra_syntax/src/ast/edit.rs index 3d023f189..b69cae234 100644 --- a/crates/ra_syntax/src/ast/edit.rs +++ b/crates/ra_syntax/src/ast/edit.rs @@ -369,21 +369,32 @@ impl ast::MatchArmList { #[must_use] pub fn remove_placeholder(&self) -> ast::MatchArmList { - let placeholder = self.arms().find(|arm| { - if let Some(ast::Pat::PlaceholderPat(_)) = arm.pat() { - return true; - } - false - }); + let placeholder = + self.arms().find(|arm| matches!(arm.pat(), Some(ast::Pat::PlaceholderPat(_)))); if let Some(placeholder) = placeholder { - let s: SyntaxElement = placeholder.syntax().clone().into(); - let e = s.clone(); - self.replace_children(s..=e, &mut iter::empty()) + self.remove_arm(&placeholder) } else { self.clone() } } + #[must_use] + fn remove_arm(&self, arm: &ast::MatchArm) -> ast::MatchArmList { + let start = arm.syntax().clone(); + let end = if let Some(comma) = start + .siblings_with_tokens(Direction::Next) + .skip(1) + .skip_while(|it| it.kind().is_trivia()) + .next() + .filter(|it| it.kind() == T![,]) + { + comma + } else { + start.clone().into() + }; + self.replace_children(start.into()..=end, None) + } + #[must_use] pub fn append_arm(&self, item: ast::MatchArm) -> ast::MatchArmList { let r_curly = match self.syntax().children_with_tokens().find(|it| it.kind() == T!['}']) { -- cgit v1.2.3