@@ -4,7 +4,7 @@ use itertools::Itertools;
44
55use syntax:: {
66 ast:: { self , HasName } ,
7- ted , AstNode , TextRange ,
7+ AstNode , TextRange ,
88} ;
99
1010use 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<(
111111trait 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 {
121122impl 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
173189fn 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