@@ -169,15 +169,30 @@ fn parse_derive_input(derive_input: ast::TokenTree) -> Result<FxHashSet<String>,
169
169
if left_paren. kind ( ) == SyntaxKind :: L_PAREN
170
170
&& right_paren. kind ( ) == SyntaxKind :: R_PAREN =>
171
171
{
172
- Ok ( derive_input
172
+ let mut input_derives = FxHashSet :: default ( ) ;
173
+ let mut current_derive = String :: new ( ) ;
174
+ for token in derive_input
173
175
. syntax ( )
174
176
. children_with_tokens ( )
175
- . filter_map ( |child| child. into_token ( ) )
176
- . skip_while ( |child| child != & left_paren)
177
- . take_while ( |child| child != & right_paren)
178
- . filter ( |child| child. kind ( ) == SyntaxKind :: IDENT )
179
- . map ( |child| child. to_string ( ) )
180
- . collect ( ) )
177
+ . filter_map ( |token| token. into_token ( ) )
178
+ . skip_while ( |token| token != & left_paren)
179
+ . skip ( 1 )
180
+ . take_while ( |token| token != & right_paren)
181
+ {
182
+ if SyntaxKind :: COMMA == token. kind ( ) {
183
+ if !current_derive. is_empty ( ) {
184
+ input_derives. insert ( current_derive) ;
185
+ current_derive = String :: new ( ) ;
186
+ }
187
+ } else {
188
+ current_derive. push_str ( token. to_string ( ) . trim ( ) ) ;
189
+ }
190
+ }
191
+
192
+ if !current_derive. is_empty ( ) {
193
+ input_derives. insert ( current_derive) ;
194
+ }
195
+ Ok ( input_derives)
181
196
}
182
197
_ => Err ( ( ) ) ,
183
198
}
@@ -188,8 +203,7 @@ fn get_derive_names_in_scope(ctx: &CompletionContext) -> FxHashSet<String> {
188
203
ctx. scope ( ) . process_all_names ( & mut |name, scope_def| {
189
204
if let hir:: ScopeDef :: MacroDef ( mac) = scope_def {
190
205
if mac. is_derive_macro ( ) {
191
- let name_string = name. to_string ( ) ;
192
- result. insert ( name_string) ;
206
+ result. insert ( name. to_string ( ) ) ;
193
207
}
194
208
}
195
209
} ) ;
@@ -321,65 +335,65 @@ mod tests {
321
335
assert_debug_snapshot ! (
322
336
do_attr_completion(
323
337
r"
324
- #[derive(Whatever , PartialEq, <|>)]
338
+ #[derive(serde::Serialize , PartialEq, <|>)]
325
339
struct Test {}
326
340
" ,
327
341
) ,
328
342
@r###"
329
343
[
330
344
CompletionItem {
331
345
label: "Clone",
332
- source_range: 51..51 ,
333
- delete: 51..51 ,
346
+ source_range: 59..59 ,
347
+ delete: 59..59 ,
334
348
insert: "Clone",
335
349
kind: Attribute,
336
350
},
337
351
CompletionItem {
338
352
label: "Copy, Clone",
339
- source_range: 51..51 ,
340
- delete: 51..51 ,
353
+ source_range: 59..59 ,
354
+ delete: 59..59 ,
341
355
insert: "Copy, Clone",
342
356
kind: Attribute,
343
357
},
344
358
CompletionItem {
345
359
label: "Debug",
346
- source_range: 51..51 ,
347
- delete: 51..51 ,
360
+ source_range: 59..59 ,
361
+ delete: 59..59 ,
348
362
insert: "Debug",
349
363
kind: Attribute,
350
364
},
351
365
CompletionItem {
352
366
label: "Default",
353
- source_range: 51..51 ,
354
- delete: 51..51 ,
367
+ source_range: 59..59 ,
368
+ delete: 59..59 ,
355
369
insert: "Default",
356
370
kind: Attribute,
357
371
},
358
372
CompletionItem {
359
373
label: "Eq",
360
- source_range: 51..51 ,
361
- delete: 51..51 ,
374
+ source_range: 59..59 ,
375
+ delete: 59..59 ,
362
376
insert: "Eq",
363
377
kind: Attribute,
364
378
},
365
379
CompletionItem {
366
380
label: "Hash",
367
- source_range: 51..51 ,
368
- delete: 51..51 ,
381
+ source_range: 59..59 ,
382
+ delete: 59..59 ,
369
383
insert: "Hash",
370
384
kind: Attribute,
371
385
},
372
386
CompletionItem {
373
387
label: "Ord, PartialOrd, Eq",
374
- source_range: 51..51 ,
375
- delete: 51..51 ,
388
+ source_range: 59..59 ,
389
+ delete: 59..59 ,
376
390
insert: "Ord, PartialOrd, Eq",
377
391
kind: Attribute,
378
392
},
379
393
CompletionItem {
380
394
label: "PartialOrd",
381
- source_range: 51..51 ,
382
- delete: 51..51 ,
395
+ source_range: 59..59 ,
396
+ delete: 59..59 ,
383
397
insert: "PartialOrd",
384
398
kind: Attribute,
385
399
},
0 commit comments