Add heuristic to determine type of IdentPat, make check for empty expressions correct

This commit is contained in:
elkowar 2021-08-21 11:00:43 +02:00
parent d6695286ee
commit 75f0701211
No known key found for this signature in database
GPG Key ID: E321AD71B1D1F27F

View File

@ -235,24 +235,36 @@ fn pick_pattern_and_expr_order(
) -> Option<(ast::Pat, ast::Expr, ast::Expr)> {
let res = match (pat, pat2) {
(ast::Pat::WildcardPat(_), _) => return None,
(pat, _) if expr2.syntax().first_child().is_none() => (pat, expr, expr2),
(_, pat) if expr.syntax().first_child().is_none() => (pat, expr2, expr),
(pat, _) if is_empty_expr(&expr2) => (pat, expr, expr2),
(_, pat) if is_empty_expr(&expr) => (pat, expr2, expr),
(pat, pat2) => match (binds_name(&pat), binds_name(&pat2)) {
(true, true) => return None,
(true, false) => (pat, expr, expr2),
(false, true) => (pat2, expr2, expr),
_ if is_sad_pat(sema, &pat2) => (pat, expr, expr2),
_ if is_sad_pat(sema, &pat) => (pat2, expr2, expr),
(true, true) => return None,
(false, false) => (pat, expr, expr2),
},
};
Some(res)
}
fn is_empty_expr(expr: &ast::Expr) -> bool {
match expr {
ast::Expr::BlockExpr(expr) => {
expr.statements().next().is_none() && expr.tail_expr().is_none()
}
ast::Expr::TupleExpr(expr) => expr.fields().next().is_none(),
_ => false,
}
}
fn binds_name(pat: &ast::Pat) -> bool {
let binds_name_v = |pat| binds_name(&pat);
match pat {
ast::Pat::IdentPat(_) => true,
ast::Pat::IdentPat(pat) => {
pat.to_string().starts_with(|c: char| c.is_lowercase() && c != '_')
}
ast::Pat::MacroPat(_) => true,
ast::Pat::OrPat(pat) => pat.pats().any(binds_name_v),
ast::Pat::SlicePat(pat) => pat.pats().any(binds_name_v),
@ -704,6 +716,28 @@ fn main() {
)
}
#[test]
fn replace_match_with_if_let_number_body() {
check_assist(
replace_match_with_if_let,
r#"
fn main() {
$0match Ok(()) {
Ok(()) => {},
Err(_) => 0,
}
}
"#,
r#"
fn main() {
if let Err(_) = Ok(()) {
0
}
}
"#,
)
}
#[test]
fn replace_match_with_if_let_exhaustive() {
check_assist(