]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide_assists/src/handlers/convert_while_to_loop.rs
Merge #11481
[rust.git] / crates / ide_assists / src / handlers / convert_while_to_loop.rs
index 2bc64e77a38fab09ee93751d616ab6b1c6240242..0fa2dcfbde1f7bea4a6f898631697e47b548316a 100644 (file)
@@ -1,5 +1,6 @@
 use std::iter::once;
 
+use ide_db::helpers::node_ext::is_pattern_cond;
 use syntax::{
     ast::{
         self,
@@ -42,7 +43,6 @@ pub(crate) fn convert_while_to_loop(acc: &mut Assists, ctx: &AssistContext) -> O
     let while_expr = while_kw.parent().and_then(ast::WhileExpr::cast)?;
     let while_body = while_expr.loop_body()?;
     let while_cond = while_expr.condition()?;
-    let while_cond_expr = while_cond.expr()?;
 
     let target = while_expr.syntax().text_range();
     acc.add(
@@ -55,19 +55,15 @@ pub(crate) fn convert_while_to_loop(acc: &mut Assists, ctx: &AssistContext) -> O
             let break_block =
                 make::block_expr(once(make::expr_stmt(make::expr_break(None)).into()), None)
                     .indent(while_indent_level);
-            let block_expr = match while_cond.pat() {
-                Some(_) => {
-                    let if_expr = make::expr_if(while_cond, while_body, Some(break_block.into()));
-                    let stmts = once(make::expr_stmt(if_expr).into());
-                    make::block_expr(stmts, None)
-                }
-                None => {
-                    let if_cond = make::condition(invert_boolean_expression(while_cond_expr), None);
-                    let if_expr = make::expr_if(if_cond, break_block, None);
-                    let stmts =
-                        once(make::expr_stmt(if_expr).into()).chain(while_body.statements());
-                    make::block_expr(stmts, while_body.tail_expr())
-                }
+            let block_expr = if is_pattern_cond(while_cond.clone()) {
+                let if_expr = make::expr_if(while_cond, while_body, Some(break_block.into()));
+                let stmts = once(make::expr_stmt(if_expr).into());
+                make::block_expr(stmts, None)
+            } else {
+                let if_cond = invert_boolean_expression(while_cond);
+                let if_expr = make::expr_if(if_cond, break_block, None);
+                let stmts = once(make::expr_stmt(if_expr).into()).chain(while_body.statements());
+                make::block_expr(stmts, while_body.tail_expr())
             };
 
             let replacement = make::expr_loop(block_expr.indent(while_indent_level));