3786: When adding match arm, don't let the floating comma r=matklad a=matklad



bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-03-31 12:53:51 +00:00 committed by GitHub
commit 2cdeb7363a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 14 deletions

View file

@ -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 => {}
}
}
"#,
);
}
}

View file

@ -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!['}']) {