@@ -254,20 +254,25 @@ fn early_expression(
254254
255255fn flat_let_chain ( mut expr : ast:: Expr ) -> Vec < ast:: Expr > {
256256 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+ } ;
257266
258267 while let ast:: Expr :: BinExpr ( bin_expr) = & expr
259268 && bin_expr. op_kind ( ) == Some ( ast:: BinaryOp :: LogicOp ( ast:: LogicOp :: And ) )
260269 && let ( Some ( lhs) , Some ( rhs) ) = ( bin_expr. lhs ( ) , bin_expr. rhs ( ) )
261270 {
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) ;
267272 expr = lhs;
268273 }
269274
270- chains . push ( expr) ;
275+ reduce_cond ( expr) ;
271276 chains. reverse ( ) ;
272277 chains
273278}
@@ -493,6 +498,93 @@ fn main() {
493498 let Some(y) = Some(8) else { return };
494499 foo(x, y);
495500}
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+ }
496588"# ,
497589 ) ;
498590 }
0 commit comments