Skip to content

Commit 0408c5a

Browse files
Merge pull request #21266 from A4-Tacks/prec-paren-replace-let-with-iflet
Fix invalid logic op for replace_let_with_if_let
2 parents ccb1138 + 6f8c393 commit 0408c5a

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

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

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ pub(crate) fn replace_let_with_if_let(acc: &mut Assists, ctx: &AssistContext<'_>
6060
}
6161
}
6262
};
63+
let init_expr =
64+
if let_expr_needs_paren(&init) { make.expr_paren(init).into() } else { init };
6365

6466
let block = make.block_expr([], None);
6567
block.indent(IndentLevel::from_node(let_stmt.syntax()));
6668
let if_expr = make.expr_if(
67-
make.expr_let(pat, init).into(),
69+
make.expr_let(pat, init_expr).into(),
6870
block,
6971
let_stmt
7072
.let_else()
@@ -79,6 +81,16 @@ pub(crate) fn replace_let_with_if_let(acc: &mut Assists, ctx: &AssistContext<'_>
7981
)
8082
}
8183

84+
fn let_expr_needs_paren(expr: &ast::Expr) -> bool {
85+
let fake_expr_let =
86+
ast::make::expr_let(ast::make::tuple_pat(None).into(), ast::make::ext::expr_unit());
87+
let Some(fake_expr) = fake_expr_let.expr() else {
88+
stdx::never!();
89+
return false;
90+
};
91+
expr.needs_parens_in_place_of(fake_expr_let.syntax(), fake_expr.syntax())
92+
}
93+
8294
#[cfg(test)]
8395
mod tests {
8496
use crate::tests::check_assist;
@@ -107,6 +119,42 @@ fn main() {
107119
)
108120
}
109121

122+
#[test]
123+
fn replace_let_logic_and() {
124+
check_assist(
125+
replace_let_with_if_let,
126+
r"
127+
fn main() {
128+
$0let x = true && false;
129+
}
130+
",
131+
r"
132+
fn main() {
133+
if let x = (true && false) {
134+
}
135+
}
136+
",
137+
)
138+
}
139+
140+
#[test]
141+
fn replace_let_logic_or() {
142+
check_assist(
143+
replace_let_with_if_let,
144+
r"
145+
fn main() {
146+
$0let x = true || false;
147+
}
148+
",
149+
r"
150+
fn main() {
151+
if let x = (true || false) {
152+
}
153+
}
154+
",
155+
)
156+
}
157+
110158
#[test]
111159
fn replace_let_else() {
112160
check_assist(

0 commit comments

Comments
 (0)