mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
Merge #2329
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:
commit
5aec3e4a7b
3 changed files with 58 additions and 5 deletions
|
@ -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(
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue