@@ -4,7 +4,7 @@ use itertools::Itertools;
4
4
5
5
use syntax:: {
6
6
ast:: { self , HasName } ,
7
- ted , AstNode , TextRange ,
7
+ AstNode , TextRange ,
8
8
} ;
9
9
10
10
use crate :: { utils:: get_methods, AssistContext , AssistId , AssistKind , Assists } ;
@@ -88,17 +88,17 @@ pub(crate) fn sort_items(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
88
88
}
89
89
90
90
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 ( ) )
92
92
} 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 ( ) ?)
94
94
} 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 ( ) )
96
96
} else if let Some ( enum_struct_variant_ast) = ctx. find_node_at_offset :: < ast:: RecordFieldList > ( )
97
97
{
98
98
// 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)
100
100
} 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 ( ) ?)
102
102
} else if let Some ( trait_ast) = ctx. find_node_at_offset :: < ast:: Trait > ( ) {
103
103
add_sort_methods_assist ( acc, ctx, trait_ast. assoc_item_list ( ) ?)
104
104
} 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<(
111
111
trait AddRewrite {
112
112
fn add_rewrite < T : AstNode > (
113
113
& mut self ,
114
+ ctx : & AssistContext < ' _ > ,
114
115
label : & str ,
115
116
old : Vec < T > ,
116
117
new : Vec < T > ,
@@ -121,24 +122,33 @@ trait AddRewrite {
121
122
impl AddRewrite for Assists {
122
123
fn add_rewrite < T : AstNode > (
123
124
& mut self ,
125
+ ctx : & AssistContext < ' _ > ,
124
126
label : & str ,
125
127
old : Vec < T > ,
126
128
new : Vec < T > ,
127
129
target : TextRange ,
128
130
) -> Option < ( ) > {
131
+ let node = old. first ( ) . unwrap ( ) . syntax ( ) . parent ( ) . unwrap ( ) ;
129
132
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)
135
141
} )
136
142
}
137
143
}
138
144
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 < ( ) > {
140
150
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) ,
142
152
_ => {
143
153
cov_mark:: hit!( not_applicable_if_sorted_or_empty_or_single) ;
144
154
None
@@ -167,11 +177,18 @@ fn add_sort_methods_assist(
167
177
return None ;
168
178
}
169
179
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
+ )
171
187
}
172
188
173
189
fn add_sort_fields_assist (
174
190
acc : & mut Assists ,
191
+ ctx : & AssistContext < ' _ > ,
175
192
record_field_list : ast:: RecordFieldList ,
176
193
) -> Option < ( ) > {
177
194
let fields: Vec < _ > = record_field_list. fields ( ) . collect ( ) ;
@@ -183,14 +200,19 @@ fn add_sort_fields_assist(
183
200
}
184
201
185
202
acc. add_rewrite (
203
+ ctx,
186
204
"Sort fields alphabetically" ,
187
205
fields,
188
206
sorted,
189
207
record_field_list. syntax ( ) . text_range ( ) ,
190
208
)
191
209
}
192
210
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 < ( ) > {
194
216
let variants: Vec < _ > = variant_list. variants ( ) . collect ( ) ;
195
217
let sorted = sort_by_name ( & variants) ;
196
218
@@ -200,6 +222,7 @@ fn add_sort_variants_assist(acc: &mut Assists, variant_list: ast::VariantList) -
200
222
}
201
223
202
224
acc. add_rewrite (
225
+ ctx,
203
226
"Sort variants alphabetically" ,
204
227
variants,
205
228
sorted,
0 commit comments