Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/replace_let_with_if_let.rs')
-rw-r--r--crates/ide-assists/src/handlers/replace_let_with_if_let.rs50
1 files changed, 49 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/replace_let_with_if_let.rs b/crates/ide-assists/src/handlers/replace_let_with_if_let.rs
index 90f4ff7ad2..b95e9b52b0 100644
--- a/crates/ide-assists/src/handlers/replace_let_with_if_let.rs
+++ b/crates/ide-assists/src/handlers/replace_let_with_if_let.rs
@@ -60,11 +60,13 @@ pub(crate) fn replace_let_with_if_let(acc: &mut Assists, ctx: &AssistContext<'_>
}
}
};
+ let init_expr =
+ if let_expr_needs_paren(&init) { make.expr_paren(init).into() } else { init };
let block = make.block_expr([], None);
block.indent(IndentLevel::from_node(let_stmt.syntax()));
let if_expr = make.expr_if(
- make.expr_let(pat, init).into(),
+ make.expr_let(pat, init_expr).into(),
block,
let_stmt
.let_else()
@@ -79,6 +81,16 @@ pub(crate) fn replace_let_with_if_let(acc: &mut Assists, ctx: &AssistContext<'_>
)
}
+fn let_expr_needs_paren(expr: &ast::Expr) -> bool {
+ let fake_expr_let =
+ ast::make::expr_let(ast::make::tuple_pat(None).into(), ast::make::ext::expr_unit());
+ let Some(fake_expr) = fake_expr_let.expr() else {
+ stdx::never!();
+ return false;
+ };
+ expr.needs_parens_in_place_of(fake_expr_let.syntax(), fake_expr.syntax())
+}
+
#[cfg(test)]
mod tests {
use crate::tests::check_assist;
@@ -108,6 +120,42 @@ fn main() {
}
#[test]
+ fn replace_let_logic_and() {
+ check_assist(
+ replace_let_with_if_let,
+ r"
+fn main() {
+ $0let x = true && false;
+}
+ ",
+ r"
+fn main() {
+ if let x = (true && false) {
+ }
+}
+ ",
+ )
+ }
+
+ #[test]
+ fn replace_let_logic_or() {
+ check_assist(
+ replace_let_with_if_let,
+ r"
+fn main() {
+ $0let x = true || false;
+}
+ ",
+ r"
+fn main() {
+ if let x = (true || false) {
+ }
+}
+ ",
+ )
+ }
+
+ #[test]
fn replace_let_else() {
check_assist(
replace_let_with_if_let,