@@ -246,20 +246,25 @@ fn early_expression(
246246
247247fn flat_let_chain ( mut expr : ast:: Expr ) -> Vec < ast:: Expr > {
248248 let mut chains = vec ! [ ] ;
249+ let mut reduce_cond = |rhs| {
250+ if !matches ! ( rhs, ast:: Expr :: LetExpr ( _) )
251+ && let Some ( last) = chains. pop_if ( |last| !matches ! ( last, ast:: Expr :: LetExpr ( _) ) )
252+ {
253+ chains. push ( make:: expr_bin_op ( rhs, ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) , last) ) ;
254+ } else {
255+ chains. push ( rhs) ;
256+ }
257+ } ;
249258
250259 while let ast:: Expr :: BinExpr ( bin_expr) = & expr
251260 && bin_expr. op_kind ( ) == Some ( ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) )
252261 && let ( Some ( lhs) , Some ( rhs) ) = ( bin_expr. lhs ( ) , bin_expr. rhs ( ) )
253262 {
254- if let Some ( last) = chains. pop_if ( |last| !matches ! ( last, ast:: Expr :: LetExpr ( _) ) ) {
255- chains. push ( make:: expr_bin_op ( rhs, ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) , last) ) ;
256- } else {
257- chains. push ( rhs) ;
258- }
263+ reduce_cond ( rhs) ;
259264 expr = lhs;
260265 }
261266
262- chains . push ( expr) ;
267+ reduce_cond ( expr) ;
263268 chains. reverse ( ) ;
264269 chains
265270}
@@ -554,6 +559,93 @@ fn main() {
554559 let Some(y) = Some(8) else { return };
555560 foo(x, y);
556561}
562+ "# ,
563+ ) ;
564+
565+ check_assist (
566+ convert_to_guarded_return,
567+ r#"
568+ fn main() {
569+ if$0 let Ok(x) = Err(92)
570+ && let Ok(y) = Ok(37)
571+ && x < 30
572+ && let Some(y) = Some(8)
573+ {
574+ foo(x, y);
575+ }
576+ }
577+ "# ,
578+ r#"
579+ fn main() {
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+ }
588+ "# ,
589+ ) ;
590+
591+ check_assist (
592+ convert_to_guarded_return,
593+ r#"
594+ fn main() {
595+ if$0 cond
596+ && let Ok(x) = Err(92)
597+ && let Ok(y) = Ok(37)
598+ && x < 30
599+ && let Some(y) = Some(8)
600+ {
601+ foo(x, y);
602+ }
603+ }
604+ "# ,
605+ r#"
606+ fn main() {
607+ if !cond {
608+ return;
609+ }
610+ let Ok(x) = Err(92) else { return };
611+ let Ok(y) = Ok(37) else { return };
612+ if x >= 30 {
613+ return;
614+ }
615+ let Some(y) = Some(8) else { return };
616+ foo(x, y);
617+ }
618+ "# ,
619+ ) ;
620+
621+ check_assist (
622+ convert_to_guarded_return,
623+ r#"
624+ fn main() {
625+ if$0 cond
626+ && foo()
627+ && let Ok(x) = Err(92)
628+ && let Ok(y) = Ok(37)
629+ && x < 30
630+ && let Some(y) = Some(8)
631+ {
632+ foo(x, y);
633+ }
634+ }
635+ "# ,
636+ r#"
637+ fn main() {
638+ if !(cond && foo()) {
639+ return;
640+ }
641+ let Ok(x) = Err(92) else { return };
642+ let Ok(y) = Ok(37) else { return };
643+ if x >= 30 {
644+ return;
645+ }
646+ let Some(y) = Some(8) else { return };
647+ foo(x, y);
648+ }
557649"# ,
558650 ) ;
559651 }
0 commit comments