diff options
| author | A4-Tacks <wdsjxhno1001@163.com> | 2025-08-22 11:38:19 +0800 |
|---|---|---|
| committer | A4-Tacks <wdsjxhno1001@163.com> | 2025-08-22 11:43:03 +0800 |
| commit | b20ddc2d3f029bdbade7d86cdcf021a7cb8c3d8b (patch) | |
| tree | 4cafeca8ab2972f82e9f0304639916b67f9a3f4f /src | |
| parent | 8e7cca83344e511e263e91f9539b8d341b2dd2bb (diff) | |
| download | rust-b20ddc2d3f029bdbade7d86cdcf021a7cb8c3d8b.tar.gz rust-b20ddc2d3f029bdbade7d86cdcf021a7cb8c3d8b.zip | |
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
}
}
```
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide-assists/src/handlers/move_guard.rs | 70 |
1 files changed, 57 insertions, 13 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/move_guard.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/move_guard.rs index 644d1f6cafe..6b50718424c 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/move_guard.rs +++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/move_guard.rs @@ -40,28 +40,34 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext<'_>) return None; } let space_before_guard = guard.syntax().prev_sibling_or_token(); + let space_after_arrow = match_arm.fat_arrow_token()?.next_sibling_or_token(); - let guard_condition = guard.condition()?; + let guard_condition = guard.condition()?.reset_indent(); let arm_expr = match_arm.expr()?; - let if_expr = - make::expr_if(guard_condition, make::block_expr(None, Some(arm_expr.clone())), None) - .indent(arm_expr.indent_level()); + let then_branch = make::block_expr(None, Some(arm_expr.reset_indent().indent(1.into()))); + let if_expr = make::expr_if(guard_condition, then_branch, None).indent(arm_expr.indent_level()); let target = guard.syntax().text_range(); acc.add( AssistId::refactor_rewrite("move_guard_to_arm_body"), "Move guard to arm body", target, - |edit| { - match space_before_guard { - Some(element) if element.kind() == WHITESPACE => { - edit.delete(element.text_range()); - } - _ => (), - }; + |builder| { + let mut edit = builder.make_editor(match_arm.syntax()); + if let Some(element) = space_before_guard + && element.kind() == WHITESPACE + { + edit.delete(element); + } + if let Some(element) = space_after_arrow + && element.kind() == WHITESPACE + { + edit.replace(element, make::tokens::single_space()); + } - edit.delete(guard.syntax().text_range()); - edit.replace_ast(arm_expr, if_expr.into()); + edit.delete(guard.syntax()); + edit.replace(arm_expr.syntax(), if_expr.syntax()); + builder.add_file_edits(ctx.vfs_file_id(), edit); }, ) } @@ -299,6 +305,44 @@ fn main() { } #[test] + fn move_multiline_guard_to_arm_body_works() { + check_assist( + move_guard_to_arm_body, + r#" +fn main() { + match 92 { + x $0if true + && true + && true => + { + { + false + } + }, + _ => true + } +} +"#, + r#" +fn main() { + match 92 { + x => if true + && true + && true { + { + { + false + } + } + }, + _ => true + } +} +"#, + ); + } + + #[test] fn move_guard_to_arm_body_works_complex_match() { check_assist( move_guard_to_arm_body, |
