@@ -51,22 +51,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext<'
51
51
// Check if there is an IfLet that we can handle.
52
52
let ( if_let_pat, cond_expr) = if is_pattern_cond ( cond. clone ( ) ) {
53
53
let let_ = single_let ( cond) ?;
54
- match let_. pat ( ) {
55
- Some ( ast:: Pat :: TupleStructPat ( pat) ) if pat. fields ( ) . count ( ) == 1 => {
56
- let path = pat. path ( ) ?;
57
- if path. qualifier ( ) . is_some ( ) {
58
- return None ;
59
- }
60
-
61
- let bound_ident = pat. fields ( ) . next ( ) ?;
62
- if !ast:: IdentPat :: can_cast ( bound_ident. syntax ( ) . kind ( ) ) {
63
- return None ;
64
- }
65
-
66
- ( Some ( ( path, bound_ident) ) , let_. expr ( ) ?)
67
- }
68
- _ => return None , // Unsupported IfLet.
69
- }
54
+ ( Some ( let_. pat ( ) ?) , let_. expr ( ) ?)
70
55
} else {
71
56
( None , cond)
72
57
} ;
@@ -136,11 +121,10 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext<'
136
121
} ;
137
122
new_expr. syntax ( ) . clone_for_update ( )
138
123
}
139
- Some ( ( path , bound_ident ) ) => {
124
+ Some ( pat ) => {
140
125
// If-let.
141
- let pat = make:: tuple_struct_pat ( path, once ( bound_ident) ) ;
142
126
let let_else_stmt = make:: let_else_stmt (
143
- pat. into ( ) ,
127
+ pat,
144
128
None ,
145
129
cond_expr,
146
130
ast:: make:: tail_only_block_expr ( early_expression) ,
@@ -442,6 +426,60 @@ fn main() {
442
426
) ;
443
427
}
444
428
429
+ #[ test]
430
+ fn convert_arbitrary_if_let_patterns ( ) {
431
+ check_assist (
432
+ convert_to_guarded_return,
433
+ r#"
434
+ fn main() {
435
+ $0if let None = Some(92) {
436
+ foo();
437
+ }
438
+ }
439
+ "# ,
440
+ r#"
441
+ fn main() {
442
+ let None = Some(92) else { return };
443
+ foo();
444
+ }
445
+ "# ,
446
+ ) ;
447
+
448
+ check_assist (
449
+ convert_to_guarded_return,
450
+ r#"
451
+ fn main() {
452
+ $0if let [1, x] = [1, 92] {
453
+ foo(x);
454
+ }
455
+ }
456
+ "# ,
457
+ r#"
458
+ fn main() {
459
+ let [1, x] = [1, 92] else { return };
460
+ foo(x);
461
+ }
462
+ "# ,
463
+ ) ;
464
+
465
+ check_assist (
466
+ convert_to_guarded_return,
467
+ r#"
468
+ fn main() {
469
+ $0if let (Some(x), None) = (Some(92), None) {
470
+ foo(x);
471
+ }
472
+ }
473
+ "# ,
474
+ r#"
475
+ fn main() {
476
+ let (Some(x), None) = (Some(92), None) else { return };
477
+ foo(x);
478
+ }
479
+ "# ,
480
+ ) ;
481
+ }
482
+
445
483
#[ test]
446
484
fn ignore_already_converted_if ( ) {
447
485
check_assist_not_applicable (
0 commit comments