@@ -254,20 +254,25 @@ fn early_expression(
254
254
255
255
fn flat_let_chain ( mut expr : ast:: Expr ) -> Vec < ast:: Expr > {
256
256
let mut chains = vec ! [ ] ;
257
+ let mut reduce_cond = |rhs| {
258
+ if !matches ! ( rhs, ast:: Expr :: LetExpr ( _) )
259
+ && let Some ( last) = chains. pop_if ( |last| !matches ! ( last, ast:: Expr :: LetExpr ( _) ) )
260
+ {
261
+ chains. push ( make:: expr_bin_op ( rhs, ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) , last) ) ;
262
+ } else {
263
+ chains. push ( rhs) ;
264
+ }
265
+ } ;
257
266
258
267
while let ast:: Expr :: BinExpr ( bin_expr) = & expr
259
268
&& bin_expr. op_kind ( ) == Some ( ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) )
260
269
&& let ( Some ( lhs) , Some ( rhs) ) = ( bin_expr. lhs ( ) , bin_expr. rhs ( ) )
261
270
{
262
- if let Some ( last) = chains. pop_if ( |last| !matches ! ( last, ast:: Expr :: LetExpr ( _) ) ) {
263
- chains. push ( make:: expr_bin_op ( rhs, ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) , last) ) ;
264
- } else {
265
- chains. push ( rhs) ;
266
- }
271
+ reduce_cond ( rhs) ;
267
272
expr = lhs;
268
273
}
269
274
270
- chains . push ( expr) ;
275
+ reduce_cond ( expr) ;
271
276
chains. reverse ( ) ;
272
277
chains
273
278
}
@@ -493,6 +498,93 @@ fn main() {
493
498
let Some(y) = Some(8) else { return };
494
499
foo(x, y);
495
500
}
501
+ "# ,
502
+ ) ;
503
+
504
+ check_assist (
505
+ convert_to_guarded_return,
506
+ r#"
507
+ fn main() {
508
+ if$0 let Ok(x) = Err(92)
509
+ && let Ok(y) = Ok(37)
510
+ && x < 30
511
+ && let Some(y) = Some(8)
512
+ {
513
+ foo(x, y);
514
+ }
515
+ }
516
+ "# ,
517
+ r#"
518
+ fn main() {
519
+ let Ok(x) = Err(92) else { return };
520
+ let Ok(y) = Ok(37) else { return };
521
+ if x >= 30 {
522
+ return;
523
+ }
524
+ let Some(y) = Some(8) else { return };
525
+ foo(x, y);
526
+ }
527
+ "# ,
528
+ ) ;
529
+
530
+ check_assist (
531
+ convert_to_guarded_return,
532
+ r#"
533
+ fn main() {
534
+ if$0 cond
535
+ && let Ok(x) = Err(92)
536
+ && let Ok(y) = Ok(37)
537
+ && x < 30
538
+ && let Some(y) = Some(8)
539
+ {
540
+ foo(x, y);
541
+ }
542
+ }
543
+ "# ,
544
+ r#"
545
+ fn main() {
546
+ if !cond {
547
+ return;
548
+ }
549
+ let Ok(x) = Err(92) else { return };
550
+ let Ok(y) = Ok(37) else { return };
551
+ if x >= 30 {
552
+ return;
553
+ }
554
+ let Some(y) = Some(8) else { return };
555
+ foo(x, y);
556
+ }
557
+ "# ,
558
+ ) ;
559
+
560
+ check_assist (
561
+ convert_to_guarded_return,
562
+ r#"
563
+ fn main() {
564
+ if$0 cond
565
+ && foo()
566
+ && let Ok(x) = Err(92)
567
+ && let Ok(y) = Ok(37)
568
+ && x < 30
569
+ && let Some(y) = Some(8)
570
+ {
571
+ foo(x, y);
572
+ }
573
+ }
574
+ "# ,
575
+ r#"
576
+ fn main() {
577
+ if !(cond && foo()) {
578
+ return;
579
+ }
580
+ let Ok(x) = Err(92) else { return };
581
+ let Ok(y) = Ok(37) else { return };
582
+ if x >= 30 {
583
+ return;
584
+ }
585
+ let Some(y) = Some(8) else { return };
586
+ foo(x, y);
587
+ }
496
588
"# ,
497
589
) ;
498
590
}
0 commit comments