Skip to content

Commit 6c18a87

Browse files
authored
Merge pull request rust-lang#20764 from A4-Tacks/fix-guarded-rhs-let-else
Fix let-expr in lhs for convert_to_guarded_return
2 parents 9c7db53 + f6eb4ea commit 6c18a87

File tree

1 file changed

+98
-6
lines changed

1 file changed

+98
-6
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/convert_to_guarded_return.rs

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

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

Comments
 (0)