2329: fix 2190; add test for "replace if let with match" r=matklad a=fkohlgrueber

Fixes #2190.

Check that the expression doesn't contain newlines only for "replace if let with match". For "join lines", enclosing blocks for multiline expressions should be removed. 

Co-authored-by: Felix Kohlgrüber <felix.kohlgrueber@gmail.com>
This commit is contained in:
bors[bot] 2019-11-20 18:16:35 +00:00 committed by GitHub
commit 5aec3e4a7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 5 deletions

View file

@ -66,8 +66,8 @@ fn build_match_expr(
fn format_arm(block: &ast::BlockExpr) -> String { fn format_arm(block: &ast::BlockExpr) -> String {
match extract_trivial_expression(block) { match extract_trivial_expression(block) {
None => block.syntax().text().to_string(), Some(e) if !e.syntax().text().contains_char('\n') => format!("{},", e.syntax().text()),
Some(e) => format!("{},", e.syntax().text()), _ => block.syntax().text().to_string(),
} }
} }
@ -102,6 +102,34 @@ impl VariantData {
) )
} }
#[test]
fn test_replace_if_let_with_match_doesnt_unwrap_multiline_expressions() {
check_assist(
replace_if_let_with_match,
"
fn foo() {
if <|>let VariantData::Struct(..) = a {
bar(
123
)
} else {
false
}
} ",
"
fn foo() {
<|>match a {
VariantData::Struct(..) => {
bar(
123
)
}
_ => false,
}
} ",
)
}
#[test] #[test]
fn replace_if_let_with_match_target() { fn replace_if_let_with_match_target() {
check_assist_target( check_assist_target(

View file

@ -38,9 +38,6 @@ fn prev_tokens(token: SyntaxToken) -> impl Iterator<Item = SyntaxToken> {
pub fn extract_trivial_expression(expr: &ast::BlockExpr) -> Option<ast::Expr> { pub fn extract_trivial_expression(expr: &ast::BlockExpr) -> Option<ast::Expr> {
let block = expr.block()?; let block = expr.block()?;
let expr = block.expr()?; let expr = block.expr()?;
if expr.syntax().text().contains_char('\n') {
return None;
}
let non_trivial_children = block.syntax().children().filter(|it| match it.kind() { let non_trivial_children = block.syntax().children().filter(|it| match it.kind() {
WHITESPACE | T!['{'] | T!['}'] => false, WHITESPACE | T!['{'] | T!['}'] => false,
_ => it != expr.syntax(), _ => it != expr.syntax(),

View file

@ -243,6 +243,34 @@ fn foo(e: Result<U, V>) {
); );
} }
#[test]
fn join_lines_multiline_in_block() {
check_join_lines(
r"
fn foo() {
match ty {
<|> Some(ty) => {
match ty {
_ => false,
}
}
_ => true,
}
}
",
r"
fn foo() {
match ty {
<|> Some(ty) => match ty {
_ => false,
},
_ => true,
}
}
",
);
}
#[test] #[test]
fn join_lines_keeps_comma_for_block_in_match_arm() { fn join_lines_keeps_comma_for_block_in_match_arm() {
// We already have a comma // We already have a comma