@@ -93,7 +93,7 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext)
93
93
available_range,
94
94
move |edit| {
95
95
let match_expr = {
96
- let else_arm = make_else_arm ( else_block) ;
96
+ let else_arm = make_else_arm ( ctx , else_block, & cond_bodies ) ;
97
97
let make_match_arm = |( pat, body) : ( _ , ast:: BlockExpr ) | {
98
98
let body = body. reset_indent ( ) . indent ( IndentLevel ( 1 ) ) ;
99
99
match pat {
@@ -125,9 +125,30 @@ pub(crate) fn replace_if_let_with_match(acc: &mut Assists, ctx: &AssistContext)
125
125
)
126
126
}
127
127
128
- fn make_else_arm ( else_block : Option < ast:: BlockExpr > ) -> ast:: MatchArm {
128
+ fn make_else_arm (
129
+ ctx : & AssistContext ,
130
+ else_block : Option < ast:: BlockExpr > ,
131
+ conditionals : & [ ( Either < ast:: Pat , ast:: Expr > , ast:: BlockExpr ) ] ,
132
+ ) -> ast:: MatchArm {
129
133
if let Some ( else_block) = else_block {
130
- let pattern = make:: wildcard_pat ( ) . into ( ) ;
134
+ let pattern = if let [ ( Either :: Left ( pat) , _) ] = conditionals {
135
+ ctx. sema
136
+ . type_of_pat ( pat)
137
+ . and_then ( |ty| TryEnum :: from_ty ( & ctx. sema , & ty. adjusted ( ) ) )
138
+ . zip ( Some ( pat) )
139
+ } else {
140
+ None
141
+ } ;
142
+ let pattern = match pattern {
143
+ Some ( ( it, pat) ) => {
144
+ if does_pat_match_variant ( pat, & it. sad_pattern ( ) ) {
145
+ it. happy_pattern_wildcard ( )
146
+ } else {
147
+ it. sad_pattern ( )
148
+ }
149
+ }
150
+ None => make:: wildcard_pat ( ) . into ( ) ,
151
+ } ;
131
152
make:: match_arm ( iter:: once ( pattern) , None , unwrap_trivial_block ( else_block) )
132
153
} else {
133
154
make:: match_arm ( iter:: once ( make:: wildcard_pat ( ) . into ( ) ) , None , make:: expr_unit ( ) )
@@ -439,7 +460,7 @@ fn foo(x: Option<i32>) {
439
460
fn foo(x: Option<i32>) {
440
461
match x {
441
462
Some(x) => println!("{}", x),
442
- _ => println!("none"),
463
+ None => println!("none"),
443
464
}
444
465
}
445
466
"# ,
@@ -464,7 +485,7 @@ fn foo(x: Option<i32>) {
464
485
fn foo(x: Option<i32>) {
465
486
match x {
466
487
None => println!("none"),
467
- _ => println!("some"),
488
+ Some(_) => println!("some"),
468
489
}
469
490
}
470
491
"# ,
@@ -489,7 +510,7 @@ fn foo(x: Result<i32, ()>) {
489
510
fn foo(x: Result<i32, ()>) {
490
511
match x {
491
512
Ok(x) => println!("{}", x),
492
- _ => println!("none"),
513
+ Err(_) => println!("none"),
493
514
}
494
515
}
495
516
"# ,
@@ -514,7 +535,7 @@ fn foo(x: Result<i32, ()>) {
514
535
fn foo(x: Result<i32, ()>) {
515
536
match x {
516
537
Err(x) => println!("{}", x),
517
- _ => println!("ok"),
538
+ Ok(_) => println!("ok"),
518
539
}
519
540
}
520
541
"# ,
@@ -553,33 +574,6 @@ fn main() {
553
574
)
554
575
}
555
576
556
- #[ test]
557
- fn replace_if_let_with_match_nested_type ( ) {
558
- check_assist (
559
- replace_if_let_with_match,
560
- r#"
561
- //- minicore: result
562
- fn foo(x: Result<i32, ()>) {
563
- let bar: Result<_, ()> = Ok(Some(1));
564
- $0if let Ok(Some(_)) = bar {
565
- ()
566
- } else {
567
- ()
568
- }
569
- }
570
- "# ,
571
- r#"
572
- fn foo(x: Result<i32, ()>) {
573
- let bar: Result<_, ()> = Ok(Some(1));
574
- match bar {
575
- Ok(Some(_)) => (),
576
- _ => (),
577
- }
578
- }
579
- "# ,
580
- ) ;
581
- }
582
-
583
577
#[ test]
584
578
fn test_replace_match_with_if_let_unwraps_simple_expressions ( ) {
585
579
check_assist (
@@ -891,6 +885,32 @@ fn foo() {
891
885
Bar(bar) => println!("bar {}", bar),
892
886
}
893
887
}
888
+ "# ,
889
+ ) ;
890
+ }
891
+
892
+ #[ test]
893
+ fn nested_type ( ) {
894
+ check_assist (
895
+ replace_if_let_with_match,
896
+ r#"
897
+ //- minicore: result
898
+ fn foo(x: Result<i32, ()>) {
899
+ let bar: Result<_, ()> = Ok(Some(1));
900
+ $0if let Ok(Some(_)) = bar {
901
+ ()
902
+ } else {
903
+ ()
904
+ }
905
+ }
906
+ "# ,
907
+ r#"
908
+ fn foo(x: Result<i32, ()>) {
909
+ let bar: Result<_, ()> = Ok(Some(1));
910
+ match bar {
911
+ Ok(Some(_)) => (),
912
+ _ => (),
913
+ }
894
914
"# ,
895
915
) ;
896
916
}
0 commit comments