diff --git a/crates/ra_assists/src/handlers/early_return.rs b/crates/ra_assists/src/handlers/early_return.rs index f3167b4e59f..ea6c56f8cff 100644 --- a/crates/ra_assists/src/handlers/early_return.rs +++ b/crates/ra_assists/src/handlers/early_return.rs @@ -104,7 +104,7 @@ pub(crate) fn convert_to_guarded_return(ctx: AssistCtx) -> Option { let then_branch = make::block_expr(once(make::expr_stmt(early_expression).into()), None); let cond = invert_boolean_expression(cond_expr); - let e = make::expr_if(cond, then_branch); + let e = make::expr_if(make::condition(cond, None), then_branch); if_indent_level.increase_indent(e) }; replace(new_expr.syntax(), &then_block, &parent_block, &if_expr) diff --git a/crates/ra_syntax/src/ast/make.rs b/crates/ra_syntax/src/ast/make.rs index ffc874a10d8..6aee3920377 100644 --- a/crates/ra_syntax/src/ast/make.rs +++ b/crates/ra_syntax/src/ast/make.rs @@ -108,7 +108,7 @@ pub fn expr_return() -> ast::Expr { pub fn expr_match(expr: ast::Expr, match_arm_list: ast::MatchArmList) -> ast::Expr { expr_from_text(&format!("match {} {}", expr, match_arm_list)) } -pub fn expr_if(condition: ast::Expr, then_branch: ast::BlockExpr) -> ast::Expr { +pub fn expr_if(condition: ast::Condition, then_branch: ast::BlockExpr) -> ast::Expr { expr_from_text(&format!("if {} {}", condition, then_branch)) } pub fn expr_prefix(op: SyntaxKind, expr: ast::Expr) -> ast::Expr { @@ -123,6 +123,15 @@ pub fn try_expr_from_text(text: &str) -> Option { try_ast_from_text(&format!("const C: () = {};", text)) } +pub fn condition(expr: ast::Expr, pattern: Option) -> ast::Condition { + match pattern { + None => ast_from_text(&format!("const _: () = while {} {{}};", expr)), + Some(pattern) => { + ast_from_text(&format!("const _: () = while {} = {} {{}};", pattern, expr)) + } + } +} + pub fn bind_pat(name: ast::Name) -> ast::BindPat { return from_text(name.text());