Skip to content

Commit c0ca61b

Browse files
committed
Migrate unmerge_match_arm Assist to use SyntaxEditor
Signed-off-by: Hayashi Mikihiro <34ttrweoewiwe28@gmail.com>
1 parent 87940a9 commit c0ca61b

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use syntax::{
22
Direction, SyntaxKind, T,
33
algo::neighbor,
4-
ast::{self, AstNode, edit::IndentLevel, make},
5-
ted::{self, Position},
4+
ast::{self, AstNode, edit::IndentLevel, syntax_factory::SyntaxFactory},
5+
syntax_editor::{Element, Position},
66
};
77

88
use crate::{AssistContext, AssistId, Assists};
@@ -33,7 +33,7 @@ use crate::{AssistContext, AssistId, Assists};
3333
// ```
3434
pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
3535
let pipe_token = ctx.find_token_syntax_at_offset(T![|])?;
36-
let or_pat = ast::OrPat::cast(pipe_token.parent()?)?.clone_for_update();
36+
let or_pat = ast::OrPat::cast(pipe_token.parent()?)?;
3737
if or_pat.leading_pipe().is_some_and(|it| it == pipe_token) {
3838
return None;
3939
}
@@ -44,13 +44,14 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
4444
// without `OrPat`.
4545

4646
let new_parent = match_arm.syntax().parent()?;
47-
let old_parent_range = new_parent.text_range();
4847

4948
acc.add(
5049
AssistId::refactor_rewrite("unmerge_match_arm"),
5150
"Unmerge match arm",
5251
pipe_token.text_range(),
5352
|edit| {
53+
let make = SyntaxFactory::with_mappings();
54+
let mut editor = edit.make_editor(&new_parent);
5455
let pats_after = pipe_token
5556
.siblings_with_tokens(Direction::Next)
5657
.filter_map(|it| ast::Pat::cast(it.into_node()?))
@@ -59,22 +60,23 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
5960
let new_pat = if pats_after.len() == 1 {
6061
pats_after[0].clone()
6162
} else {
62-
make::or_pat(pats_after, or_pat.leading_pipe().is_some()).into()
63+
make.or_pat(pats_after, or_pat.leading_pipe().is_some()).into()
6364
};
64-
let new_match_arm =
65-
make::match_arm(new_pat, match_arm.guard(), match_arm_body).clone_for_update();
66-
65+
let new_match_arm = make.match_arm(new_pat, match_arm.guard(), match_arm_body);
6766
let mut pipe_index = pipe_token.index();
6867
if pipe_token
6968
.prev_sibling_or_token()
7069
.is_some_and(|it| it.kind() == SyntaxKind::WHITESPACE)
7170
{
7271
pipe_index -= 1;
7372
}
74-
or_pat.syntax().splice_children(
75-
pipe_index..or_pat.syntax().children_with_tokens().count(),
76-
Vec::new(),
77-
);
73+
for child in or_pat
74+
.syntax()
75+
.children_with_tokens()
76+
.skip_while(|child| child.index() < pipe_index)
77+
{
78+
editor.delete(child.syntax_element());
79+
}
7880

7981
let mut insert_after_old_arm = Vec::new();
8082

@@ -95,24 +97,20 @@ pub(crate) fn unmerge_match_arm(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
9597
== Some(T![,]);
9698
let has_arms_after = neighbor(&match_arm, Direction::Next).is_some();
9799
if !has_comma_after && !has_arms_after {
98-
insert_after_old_arm.push(make::token(T![,]).into());
100+
insert_after_old_arm.push(make.token(T![,]).into());
99101
}
100102

101103
let indent = IndentLevel::from_node(match_arm.syntax());
102-
insert_after_old_arm.push(make::tokens::whitespace(&format!("\n{indent}")).into());
104+
insert_after_old_arm.push(make.whitespace(&format!("\n{indent}")).into());
103105

104106
insert_after_old_arm.push(new_match_arm.syntax().clone().into());
105107

106-
ted::insert_all_raw(Position::after(match_arm.syntax()), insert_after_old_arm);
107-
108108
if has_comma_after {
109-
ted::insert_raw(
110-
Position::last_child_of(new_match_arm.syntax()),
111-
make::token(T![,]),
112-
);
109+
insert_after_old_arm.push(make.token(T![,]).into());
113110
}
114-
115-
edit.replace(old_parent_range, new_parent.to_string());
111+
editor.insert_all(Position::after(match_arm.syntax()), insert_after_old_arm);
112+
editor.add_mappings(make.finish_with_mappings());
113+
edit.add_file_edits(ctx.vfs_file_id(), editor);
116114
},
117115
)
118116
}

0 commit comments

Comments
 (0)