diff --git a/crates/ide_assists/src/handlers/replace_if_let_with_match.rs b/crates/ide_assists/src/handlers/replace_if_let_with_match.rs index 323f58acbbe..d3269ef4d41 100644 --- a/crates/ide_assists/src/handlers/replace_if_let_with_match.rs +++ b/crates/ide_assists/src/handlers/replace_if_let_with_match.rs @@ -235,12 +235,14 @@ fn pick_pattern_and_expr_order( ) -> Option<(ast::Pat, ast::Expr, ast::Expr)> { let res = match (pat, pat2) { (ast::Pat::WildcardPat(_), _) => return None, - (pat, sad_pat) if is_sad_pat(sema, &sad_pat) => (pat, expr, expr2), - (sad_pat, pat) if is_sad_pat(sema, &sad_pat) => (pat, expr2, expr), + (pat, _) if expr2.syntax().first_child().is_none() => (pat, expr, expr2), + (_, pat) if expr.syntax().first_child().is_none() => (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), }, }; @@ -762,6 +764,46 @@ fn foo() { ); } + #[test] + fn replace_match_with_if_let_prefer_nonempty_body() { + check_assist( + replace_match_with_if_let, + r#" +fn foo() { + match $0Ok(0) { + Ok(value) => {}, + Err(err) => eprintln!("{}", err), + } +} +"#, + r#" +fn foo() { + if let Err(err) = Ok(0) { + eprintln!("{}", err) + } +} +"#, + ); + check_assist( + replace_match_with_if_let, + r#" +fn foo() { + match $0Ok(0) { + Err(err) => eprintln!("{}", err), + Ok(value) => {}, + } +} +"#, + r#" +fn foo() { + if let Err(err) = Ok(0) { + eprintln!("{}", err) + } +} +"#, + ); + } + #[test] fn replace_match_with_if_let_rejects_double_name_bindings() { check_assist_not_applicable(