Skip to content

Commit 6f727e0

Browse files
committed
feat: migrate sort_items assist to use SyntaxFactory
Signed-off-by: Tarek <[email protected]>
1 parent c0bbbb3 commit 6f727e0

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

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

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use itertools::Itertools;
44

55
use syntax::{
66
ast::{self, HasName},
7-
ted, AstNode, TextRange,
7+
AstNode, TextRange,
88
};
99

1010
use crate::{utils::get_methods, AssistContext, AssistId, AssistKind, Assists};
@@ -88,17 +88,17 @@ pub(crate) fn sort_items(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
8888
}
8989

9090
if let Some(struct_ast) = ctx.find_node_at_offset::<ast::Struct>() {
91-
add_sort_field_list_assist(acc, struct_ast.field_list())
91+
add_sort_field_list_assist(acc, ctx, struct_ast.field_list())
9292
} else if let Some(union_ast) = ctx.find_node_at_offset::<ast::Union>() {
93-
add_sort_fields_assist(acc, union_ast.record_field_list()?)
93+
add_sort_fields_assist(acc, ctx, union_ast.record_field_list()?)
9494
} else if let Some(variant_ast) = ctx.find_node_at_offset::<ast::Variant>() {
95-
add_sort_field_list_assist(acc, variant_ast.field_list())
95+
add_sort_field_list_assist(acc, ctx, variant_ast.field_list())
9696
} else if let Some(enum_struct_variant_ast) = ctx.find_node_at_offset::<ast::RecordFieldList>()
9797
{
9898
// should be above enum and below struct
99-
add_sort_fields_assist(acc, enum_struct_variant_ast)
99+
add_sort_fields_assist(acc, ctx, enum_struct_variant_ast)
100100
} else if let Some(enum_ast) = ctx.find_node_at_offset::<ast::Enum>() {
101-
add_sort_variants_assist(acc, enum_ast.variant_list()?)
101+
add_sort_variants_assist(acc, ctx, enum_ast.variant_list()?)
102102
} else if let Some(trait_ast) = ctx.find_node_at_offset::<ast::Trait>() {
103103
add_sort_methods_assist(acc, ctx, trait_ast.assoc_item_list()?)
104104
} else if let Some(impl_ast) = ctx.find_node_at_offset::<ast::Impl>() {
@@ -111,6 +111,7 @@ pub(crate) fn sort_items(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
111111
trait AddRewrite {
112112
fn add_rewrite<T: AstNode>(
113113
&mut self,
114+
ctx: &AssistContext<'_>,
114115
label: &str,
115116
old: Vec<T>,
116117
new: Vec<T>,
@@ -121,24 +122,33 @@ trait AddRewrite {
121122
impl AddRewrite for Assists {
122123
fn add_rewrite<T: AstNode>(
123124
&mut self,
125+
ctx: &AssistContext<'_>,
124126
label: &str,
125127
old: Vec<T>,
126128
new: Vec<T>,
127129
target: TextRange,
128130
) -> Option<()> {
131+
let node = old.first().unwrap().syntax().parent().unwrap();
129132
self.add(AssistId("sort_items", AssistKind::RefactorRewrite), label, target, |builder| {
130-
let mutable: Vec<T> = old.into_iter().map(|it| builder.make_mut(it)).collect();
131-
mutable
132-
.into_iter()
133-
.zip(new)
134-
.for_each(|(old, new)| ted::replace(old.syntax(), new.clone_for_update().syntax()));
133+
let mut editor = builder.make_editor(&node);
134+
135+
old.into_iter().zip(new).for_each(|(old, new)| {
136+
// FIXME: remove `clone_for_update` when `SyntaxEditor` handles it for us
137+
editor.replace(old.syntax(), new.clone_for_update().syntax())
138+
});
139+
140+
builder.add_file_edits(ctx.file_id(), editor)
135141
})
136142
}
137143
}
138144

139-
fn add_sort_field_list_assist(acc: &mut Assists, field_list: Option<ast::FieldList>) -> Option<()> {
145+
fn add_sort_field_list_assist(
146+
acc: &mut Assists,
147+
ctx: &AssistContext<'_>,
148+
field_list: Option<ast::FieldList>,
149+
) -> Option<()> {
140150
match field_list {
141-
Some(ast::FieldList::RecordFieldList(it)) => add_sort_fields_assist(acc, it),
151+
Some(ast::FieldList::RecordFieldList(it)) => add_sort_fields_assist(acc, ctx, it),
142152
_ => {
143153
cov_mark::hit!(not_applicable_if_sorted_or_empty_or_single);
144154
None
@@ -167,11 +177,18 @@ fn add_sort_methods_assist(
167177
return None;
168178
}
169179

170-
acc.add_rewrite("Sort methods alphabetically", methods, sorted, item_list.syntax().text_range())
180+
acc.add_rewrite(
181+
ctx,
182+
"Sort methods alphabetically",
183+
methods,
184+
sorted,
185+
item_list.syntax().text_range(),
186+
)
171187
}
172188

173189
fn add_sort_fields_assist(
174190
acc: &mut Assists,
191+
ctx: &AssistContext<'_>,
175192
record_field_list: ast::RecordFieldList,
176193
) -> Option<()> {
177194
let fields: Vec<_> = record_field_list.fields().collect();
@@ -183,14 +200,19 @@ fn add_sort_fields_assist(
183200
}
184201

185202
acc.add_rewrite(
203+
ctx,
186204
"Sort fields alphabetically",
187205
fields,
188206
sorted,
189207
record_field_list.syntax().text_range(),
190208
)
191209
}
192210

193-
fn add_sort_variants_assist(acc: &mut Assists, variant_list: ast::VariantList) -> Option<()> {
211+
fn add_sort_variants_assist(
212+
acc: &mut Assists,
213+
ctx: &AssistContext<'_>,
214+
variant_list: ast::VariantList,
215+
) -> Option<()> {
194216
let variants: Vec<_> = variant_list.variants().collect();
195217
let sorted = sort_by_name(&variants);
196218

@@ -200,6 +222,7 @@ fn add_sort_variants_assist(acc: &mut Assists, variant_list: ast::VariantList) -
200222
}
201223

202224
acc.add_rewrite(
225+
ctx,
203226
"Sort variants alphabetically",
204227
variants,
205228
sorted,

0 commit comments

Comments
 (0)