Apply make_else_arm to general case

This commit is contained in:
k-nasa 2021-10-09 13:19:21 +09:00
parent 388525fa0d
commit aeee70397e

View File

@ -93,7 +93,7 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext)
available_range, available_range,
move |edit| { move |edit| {
let match_expr = { let match_expr = {
let else_arm = make_else_arm(ctx, else_block, &cond_bodies); let else_arm = make_else_arm(else_block);
let make_match_arm = |(pat, body): (_, ast::BlockExpr)| { let make_match_arm = |(pat, body): (_, ast::BlockExpr)| {
let body = body.reset_indent().indent(IndentLevel(1)); let body = body.reset_indent().indent(IndentLevel(1));
match pat { match pat {
@ -125,30 +125,9 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext)
) )
} }
fn make_else_arm( fn make_else_arm(else_block: Option<ast::BlockExpr>) -> ast::MatchArm {
ctx: &AssistContext,
else_block: Option<ast::BlockExpr>,
conditionals: &[(Either<ast::Pat, ast::Expr>, ast::BlockExpr)],
) -> ast::MatchArm {
if let Some(else_block) = else_block { if let Some(else_block) = else_block {
let pattern = if let [(Either::Left(pat), _)] = conditionals { let pattern = make::wildcard_pat().into();
ctx.sema
.type_of_pat(pat)
.and_then(|ty| TryEnum::from_ty(&ctx.sema, &ty.adjusted()))
.zip(Some(pat))
} else {
None
};
let pattern = match pattern {
Some((it, pat)) => {
if does_pat_match_variant(pat, &it.sad_pattern()) {
it.happy_pattern_wildcard()
} else {
it.sad_pattern()
}
}
None => make::wildcard_pat().into(),
};
make::match_arm(iter::once(pattern), None, unwrap_trivial_block(else_block)) make::match_arm(iter::once(pattern), None, unwrap_trivial_block(else_block))
} else { } else {
make::match_arm(iter::once(make::wildcard_pat().into()), None, make::expr_unit()) make::match_arm(iter::once(make::wildcard_pat().into()), None, make::expr_unit())
@ -460,7 +439,7 @@ fn foo(x: Option<i32>) {
fn foo(x: Option<i32>) { fn foo(x: Option<i32>) {
match x { match x {
Some(x) => println!("{}", x), Some(x) => println!("{}", x),
None => println!("none"), _ => println!("none"),
} }
} }
"#, "#,
@ -485,7 +464,7 @@ fn foo(x: Option<i32>) {
fn foo(x: Option<i32>) { fn foo(x: Option<i32>) {
match x { match x {
None => println!("none"), None => println!("none"),
Some(_) => println!("some"), _ => println!("some"),
} }
} }
"#, "#,
@ -510,7 +489,7 @@ fn foo(x: Result<i32, ()>) {
fn foo(x: Result<i32, ()>) { fn foo(x: Result<i32, ()>) {
match x { match x {
Ok(x) => println!("{}", x), Ok(x) => println!("{}", x),
Err(_) => println!("none"), _ => println!("none"),
} }
} }
"#, "#,
@ -535,7 +514,7 @@ fn foo(x: Result<i32, ()>) {
fn foo(x: Result<i32, ()>) { fn foo(x: Result<i32, ()>) {
match x { match x {
Err(x) => println!("{}", x), Err(x) => println!("{}", x),
Ok(_) => println!("ok"), _ => println!("ok"),
} }
} }
"#, "#,
@ -574,6 +553,33 @@ fn main() {
) )
} }
#[test]
fn replace_if_let_with_match_nested_type() {
check_assist(
replace_if_let_with_match,
r#"
//- minicore: result
fn foo(x: Result<i32, ()>) {
let bar: Result<_, ()> = Ok(Some(1));
$0if let Ok(Some(_)) = bar {
()
} else {
()
}
}
"#,
r#"
fn foo(x: Result<i32, ()>) {
let bar: Result<_, ()> = Ok(Some(1));
match bar {
Ok(Some(_)) => (),
_ => (),
}
}
"#,
);
}
#[test] #[test]
fn test_replace_match_with_if_let_unwraps_simple_expressions() { fn test_replace_match_with_if_let_unwraps_simple_expressions() {
check_assist( check_assist(
@ -885,32 +891,6 @@ fn foo() {
Bar(bar) => println!("bar {}", bar), Bar(bar) => println!("bar {}", bar),
} }
} }
"#,
);
}
#[test]
fn nested_type() {
check_assist(
replace_if_let_with_match,
r#"
//- minicore: result
fn foo(x: Result<i32, ()>) {
let bar: Result<_, ()> = Ok(Some(1));
$0if let Ok(Some(_)) = bar {
()
} else {
()
}
}
"#,
r#"
fn foo(x: Result<i32, ()>) {
let bar: Result<_, ()> = Ok(Some(1));
match bar {
Ok(Some(_)) => (),
_ => (),
}
"#, "#,
); );
} }