From a4c6e8c4e22ddea9668eb3380603ad53d8ce6a5e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 5 Feb 2020 10:50:07 +0100 Subject: Refactor if-let -> match assist to use ast::make --- .../src/assists/replace_if_let_with_match.rs | 49 ++++++++++------------ 1 file changed, 22 insertions(+), 27 deletions(-) (limited to 'crates/ra_assists/src/assists/replace_if_let_with_match.rs') diff --git a/crates/ra_assists/src/assists/replace_if_let_with_match.rs b/crates/ra_assists/src/assists/replace_if_let_with_match.rs index c9b62e5ff..c8b13b7b3 100644 --- a/crates/ra_assists/src/assists/replace_if_let_with_match.rs +++ b/crates/ra_assists/src/assists/replace_if_let_with_match.rs @@ -1,9 +1,12 @@ -use format_buf::format; use hir::db::HirDatabase; -use ra_fmt::extract_trivial_expression; -use ra_syntax::{ast, AstNode}; +use ra_fmt::unwrap_trivial_block; +use ra_syntax::{ + ast::{self, make}, + AstNode, +}; use crate::{Assist, AssistCtx, AssistId}; +use ast::edit::IndentLevel; // Assist: replace_if_let_with_match // @@ -43,32 +46,24 @@ pub(crate) fn replace_if_let_with_match(ctx: AssistCtx) -> Opt }; ctx.add_assist(AssistId("replace_if_let_with_match"), "Replace with match", |edit| { - let match_expr = build_match_expr(expr, pat, then_block, else_block); - edit.target(if_expr.syntax().text_range()); - edit.replace_node_and_indent(if_expr.syntax(), match_expr); - edit.set_cursor(if_expr.syntax().text_range().start()) - }) -} + let match_expr = { + let then_arm = { + let then_expr = unwrap_trivial_block(then_block); + make::match_arm(vec![pat], then_expr) + }; + let else_arm = { + let else_expr = unwrap_trivial_block(else_block); + make::match_arm(vec![make::placeholder_pat().into()], else_expr) + }; + make::expr_match(expr, make::match_arm_list(vec![then_arm, else_arm])) + }; -fn build_match_expr( - expr: ast::Expr, - pat1: ast::Pat, - arm1: ast::BlockExpr, - arm2: ast::BlockExpr, -) -> String { - let mut buf = String::new(); - format!(buf, "match {} {{\n", expr.syntax().text()); - format!(buf, " {} => {}\n", pat1.syntax().text(), format_arm(&arm1)); - format!(buf, " _ => {}\n", format_arm(&arm2)); - buf.push_str("}"); - buf -} + let match_expr = IndentLevel::from_node(if_expr.syntax()).increase_indent(match_expr); -fn format_arm(block: &ast::BlockExpr) -> String { - match extract_trivial_expression(block) { - Some(e) if !e.syntax().text().contains_char('\n') => format!("{},", e.syntax().text()), - _ => block.syntax().text().to_string(), - } + edit.target(if_expr.syntax().text_range()); + edit.set_cursor(if_expr.syntax().text_range().start()); + edit.replace_ast::(if_expr.into(), match_expr.into()); + }) } #[cfg(test)] -- cgit v1.2.3