Skip to content

Commit f5f797e

Browse files
committed
Fix indent for move_guard_to_arm_body
Input: ```rust fn main() { match 92 { x $0if true && true && true => { { false } }, _ => true } } ``` Old output: ```rust fn main() { match 92 { x => if true && true && true { { { false } } }, _ => true }; } ``` This PR fixed: ```rust fn main() { match 92 { x => if true && true && true { { { false } } }, _ => true } } ```
1 parent e10fa93 commit f5f797e

File tree

1 file changed

+57
-13
lines changed

1 file changed

+57
-13
lines changed

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

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,34 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_>)
4040
return None;
4141
}
4242
let space_before_guard = guard.syntax().prev_sibling_or_token();
43+
let space_after_arrow = match_arm.fat_arrow_token()?.next_sibling_or_token();
4344

44-
let guard_condition = guard.condition()?;
45+
let guard_condition = guard.condition()?.reset_indent();
4546
let arm_expr = match_arm.expr()?;
46-
let if_expr =
47-
make::expr_if(guard_condition, make::block_expr(None, Some(arm_expr.clone())), None)
48-
.indent(arm_expr.indent_level());
47+
let then_branch = make::block_expr(None, Some(arm_expr.reset_indent().indent(1.into())));
48+
let if_expr = make::expr_if(guard_condition, then_branch, None).indent(arm_expr.indent_level());
4949

5050
let target = guard.syntax().text_range();
5151
acc.add(
5252
AssistId::refactor_rewrite("move_guard_to_arm_body"),
5353
"Move guard to arm body",
5454
target,
55-
|edit| {
56-
match space_before_guard {
57-
Some(element) if element.kind() == WHITESPACE => {
58-
edit.delete(element.text_range());
59-
}
60-
_ => (),
61-
};
55+
|builder| {
56+
let mut edit = builder.make_editor(match_arm.syntax());
57+
if let Some(element) = space_before_guard
58+
&& element.kind() == WHITESPACE
59+
{
60+
edit.delete(element);
61+
}
62+
if let Some(element) = space_after_arrow
63+
&& element.kind() == WHITESPACE
64+
{
65+
edit.replace(element, make::tokens::single_space());
66+
}
6267

63-
edit.delete(guard.syntax().text_range());
64-
edit.replace_ast(arm_expr, if_expr.into());
68+
edit.delete(guard.syntax());
69+
edit.replace(arm_expr.syntax(), if_expr.syntax());
70+
builder.add_file_edits(ctx.vfs_file_id(), edit);
6571
},
6672
)
6773
}
@@ -298,6 +304,44 @@ fn main() {
298304
);
299305
}
300306

307+
#[test]
308+
fn move_multiline_guard_to_arm_body_works() {
309+
check_assist(
310+
move_guard_to_arm_body,
311+
r#"
312+
fn main() {
313+
match 92 {
314+
x $0if true
315+
&& true
316+
&& true =>
317+
{
318+
{
319+
false
320+
}
321+
},
322+
_ => true
323+
}
324+
}
325+
"#,
326+
r#"
327+
fn main() {
328+
match 92 {
329+
x => if true
330+
&& true
331+
&& true {
332+
{
333+
{
334+
false
335+
}
336+
}
337+
},
338+
_ => true
339+
}
340+
}
341+
"#,
342+
);
343+
}
344+
301345
#[test]
302346
fn move_guard_to_arm_body_works_complex_match() {
303347
check_assist(

0 commit comments

Comments
 (0)