@@ -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) ]
8395mod 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