@@ -87,11 +87,7 @@ pub(crate) fn sort_items(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
87
87
return None ;
88
88
}
89
89
90
- if let Some ( trait_ast) = ctx. find_node_at_offset :: < ast:: Trait > ( ) {
91
- add_sort_methods_assist ( acc, trait_ast. assoc_item_list ( ) ?)
92
- } else if let Some ( impl_ast) = ctx. find_node_at_offset :: < ast:: Impl > ( ) {
93
- add_sort_methods_assist ( acc, impl_ast. assoc_item_list ( ) ?)
94
- } else if let Some ( struct_ast) = ctx. find_node_at_offset :: < ast:: Struct > ( ) {
90
+ if let Some ( struct_ast) = ctx. find_node_at_offset :: < ast:: Struct > ( ) {
95
91
add_sort_field_list_assist ( acc, struct_ast. field_list ( ) )
96
92
} else if let Some ( union_ast) = ctx. find_node_at_offset :: < ast:: Union > ( ) {
97
93
add_sort_fields_assist ( acc, union_ast. record_field_list ( ) ?)
@@ -103,6 +99,10 @@ pub(crate) fn sort_items(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
103
99
add_sort_fields_assist ( acc, enum_struct_variant_ast)
104
100
} else if let Some ( enum_ast) = ctx. find_node_at_offset :: < ast:: Enum > ( ) {
105
101
add_sort_variants_assist ( acc, enum_ast. variant_list ( ) ?)
102
+ } else if let Some ( trait_ast) = ctx. find_node_at_offset :: < ast:: Trait > ( ) {
103
+ add_sort_methods_assist ( acc, ctx, trait_ast. assoc_item_list ( ) ?)
104
+ } else if let Some ( impl_ast) = ctx. find_node_at_offset :: < ast:: Impl > ( ) {
105
+ add_sort_methods_assist ( acc, ctx, impl_ast. assoc_item_list ( ) ?)
106
106
} else {
107
107
None
108
108
}
@@ -148,7 +148,19 @@ fn add_sort_field_list_assist(acc: &mut Assists, field_list: Option<ast::FieldLi
148
148
}
149
149
}
150
150
151
- fn add_sort_methods_assist ( acc : & mut Assists , item_list : ast:: AssocItemList ) -> Option < ( ) > {
151
+ fn add_sort_methods_assist (
152
+ acc : & mut Assists ,
153
+ ctx : & AssistContext < ' _ > ,
154
+ item_list : ast:: AssocItemList ,
155
+ ) -> Option < ( ) > {
156
+ let selection = ctx. selection_trimmed ( ) ;
157
+
158
+ // ignore assist if the selection intersects with an associated item.
159
+ if item_list. assoc_items ( ) . any ( |item| item. syntax ( ) . text_range ( ) . intersect ( selection) . is_some ( ) )
160
+ {
161
+ return None ;
162
+ }
163
+
152
164
let methods = get_methods ( & item_list) ;
153
165
let sorted = sort_by_name ( & methods) ;
154
166
@@ -218,6 +230,51 @@ mod tests {
218
230
219
231
use super :: * ;
220
232
233
+ #[ test]
234
+ fn not_applicable_if_selection_in_fn_body ( ) {
235
+ check_assist_not_applicable (
236
+ sort_items,
237
+ r#"
238
+ struct S;
239
+ impl S {
240
+ fn func2() {
241
+ $0 bar $0
242
+ }
243
+ fn func() {}
244
+ }
245
+ "# ,
246
+ )
247
+ }
248
+
249
+ #[ test]
250
+ fn not_applicable_if_selection_at_associated_const ( ) {
251
+ check_assist_not_applicable (
252
+ sort_items,
253
+ r#"
254
+ struct S;
255
+ impl S {
256
+ fn func2() {}
257
+ fn func() {}
258
+ const C: () = $0()$0;
259
+ }
260
+ "# ,
261
+ )
262
+ }
263
+
264
+ #[ test]
265
+ fn not_applicable_if_selection_overlaps_nodes ( ) {
266
+ check_assist_not_applicable (
267
+ sort_items,
268
+ r#"
269
+ struct S;
270
+ impl $0S {
271
+ fn$0 func2() {}
272
+ fn func() {}
273
+ }
274
+ "# ,
275
+ )
276
+ }
277
+
221
278
#[ test]
222
279
fn not_applicable_if_no_selection ( ) {
223
280
cov_mark:: check!( not_applicable_if_no_selection) ;
@@ -233,6 +290,21 @@ t$0rait Bar {
233
290
)
234
291
}
235
292
293
+ #[ test]
294
+ fn not_applicable_if_selection_in_trait_fn_body ( ) {
295
+ check_assist_not_applicable (
296
+ sort_items,
297
+ r#"
298
+ trait Bar {
299
+ fn b() {
300
+ $0 hello $0
301
+ }
302
+ fn a();
303
+ }
304
+ "# ,
305
+ )
306
+ }
307
+
236
308
#[ test]
237
309
fn not_applicable_if_trait_empty ( ) {
238
310
cov_mark:: check!( not_applicable_if_sorted_or_empty_or_single) ;
@@ -460,6 +532,31 @@ struct Bar {
460
532
)
461
533
}
462
534
535
+ #[ test]
536
+ fn sort_struct_inside_a_function ( ) {
537
+ check_assist (
538
+ sort_items,
539
+ r#"
540
+ fn hello() {
541
+ $0struct Bar$0 {
542
+ b: u8,
543
+ a: u32,
544
+ c: u64,
545
+ }
546
+ }
547
+ "# ,
548
+ r#"
549
+ fn hello() {
550
+ struct Bar {
551
+ a: u32,
552
+ b: u8,
553
+ c: u64,
554
+ }
555
+ }
556
+ "# ,
557
+ )
558
+ }
559
+
463
560
#[ test]
464
561
fn sort_generic_struct_with_lifetime ( ) {
465
562
check_assist (
0 commit comments