From a6a052f4078825ba307843df1770c92d96827075 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 13 Oct 2021 20:36:04 +0900 Subject: [PATCH] Revert "Apply make_else_arm to general case" This reverts commit aeee70397e8230117f0097fa8624d59d910bd324. --- .../src/handlers/replace_if_let_with_match.rs | 88 ++++++++++++------- 1 file changed, 54 insertions(+), 34 deletions(-) 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 5b766ecbeae..6f383ae8bba 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 @@ -93,7 +93,7 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext) available_range, move |edit| { let match_expr = { - let else_arm = make_else_arm(else_block); + let else_arm = make_else_arm(ctx, else_block, &cond_bodies); let make_match_arm = |(pat, body): (_, ast::BlockExpr)| { let body = body.reset_indent().indent(IndentLevel(1)); match pat { @@ -125,9 +125,30 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext) ) } -fn make_else_arm(else_block: Option) -> ast::MatchArm { +fn make_else_arm( + ctx: &AssistContext, + else_block: Option, + conditionals: &[(Either, ast::BlockExpr)], +) -> ast::MatchArm { if let Some(else_block) = else_block { - let pattern = make::wildcard_pat().into(); + let pattern = if let [(Either::Left(pat), _)] = conditionals { + 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)) } else { make::match_arm(iter::once(make::wildcard_pat().into()), None, make::expr_unit()) @@ -439,7 +460,7 @@ fn foo(x: Option) { fn foo(x: Option) { match x { Some(x) => println!("{}", x), - _ => println!("none"), + None => println!("none"), } } "#, @@ -464,7 +485,7 @@ fn foo(x: Option) { fn foo(x: Option) { match x { None => println!("none"), - _ => println!("some"), + Some(_) => println!("some"), } } "#, @@ -489,7 +510,7 @@ fn foo(x: Result) { fn foo(x: Result) { match x { Ok(x) => println!("{}", x), - _ => println!("none"), + Err(_) => println!("none"), } } "#, @@ -514,7 +535,7 @@ fn foo(x: Result) { fn foo(x: Result) { match x { Err(x) => println!("{}", x), - _ => println!("ok"), + Ok(_) => println!("ok"), } } "#, @@ -553,33 +574,6 @@ 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) { - let bar: Result<_, ()> = Ok(Some(1)); - $0if let Ok(Some(_)) = bar { - () - } else { - () - } -} -"#, - r#" -fn foo(x: Result) { - let bar: Result<_, ()> = Ok(Some(1)); - match bar { - Ok(Some(_)) => (), - _ => (), - } -} -"#, - ); - } - #[test] fn test_replace_match_with_if_let_unwraps_simple_expressions() { check_assist( @@ -891,6 +885,32 @@ fn foo() { Bar(bar) => println!("bar {}", bar), } } +"#, + ); + } + + #[test] + fn nested_type() { + check_assist( + replace_if_let_with_match, + r#" +//- minicore: result +fn foo(x: Result) { + let bar: Result<_, ()> = Ok(Some(1)); + $0if let Ok(Some(_)) = bar { + () + } else { + () + } +} +"#, + r#" +fn foo(x: Result) { + let bar: Result<_, ()> = Ok(Some(1)); + match bar { + Ok(Some(_)) => (), + _ => (), + } "#, ); } -- 2.44.0