From 2fe6e23138d990a852a59d9680847cb6718565bb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Mar 2020 14:52:20 +0200 Subject: [PATCH] When adding match arm, don't let the floating comma --- .../src/handlers/fill_match_arms.rs | 30 +++++++++++++++---- crates/ra_syntax/src/ast/edit.rs | 29 ++++++++++++------ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/crates/ra_assists/src/handlers/fill_match_arms.rs b/crates/ra_assists/src/handlers/fill_match_arms.rs index 41bb97928d..8d1af99336 100644 --- a/crates/ra_assists/src/handlers/fill_match_arms.rs +++ b/crates/ra_assists/src/handlers/fill_match_arms.rs @@ -1,15 +1,11 @@ -//! FIXME: write short doc here - use std::iter; use hir::{Adt, HasSource, ModuleDef, Semantics}; use itertools::Itertools; use ra_ide_db::RootDatabase; +use ra_syntax::ast::{self, make, AstNode, MatchArm, NameOwner, Pat}; use crate::{Assist, AssistCtx, AssistId}; -use ra_syntax::ast::{self, make, AstNode, NameOwner}; - -use ast::{MatchArm, Pat}; // Assist: fill_match_arms // @@ -717,4 +713,28 @@ mod tests { "#, ); } + + #[test] + fn fill_match_arms_placeholder() { + check_assist( + fill_match_arms, + r#" + enum A { One, Two, } + fn foo(a: A) { + match a<|> { + _ => (), + } + } + "#, + r#" + enum A { One, Two, } + fn foo(a: A) { + match <|>a { + A::One => {} + A::Two => {} + } + } + "#, + ); + } } diff --git a/crates/ra_syntax/src/ast/edit.rs b/crates/ra_syntax/src/ast/edit.rs index 3d023f1891..b69cae234c 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!['}']) {