Skip to content

Commit 9a7afe1

Browse files
committed
Fix let-expr in lhs for convert_to_guarded_return
Example --- ```rust fn main() { if$0 let Ok(x) = Err(92) && let Ok(y) = Ok(37) && x < 30 && let Some(y) = Some(8) { foo(x, y); } } ``` **Before this PR**: ```rust fn main() { let Ok(x) = Err(92) else { return }; if !(let Ok(y) = Ok(37) && x < 30) { return; } let Some(y) = Some(8) else { return }; foo(x, y); } ``` **After this PR**: ```rust fn main() { let Ok(x) = Err(92) else { return }; let Ok(y) = Ok(37) else { return }; if x >= 30 { return; } let Some(y) = Some(8) else { return }; foo(x, y); } ```
1 parent a56e577 commit 9a7afe1

File tree

1 file changed

+98
-6
lines changed

1 file changed

+98
-6
lines changed

crates/ide-assists/src/handlers/convert_to_guarded_return.rs

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,20 +254,25 @@ fn early_expression(
254254

255255
fn 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

Comments
 (0)