@@ -169,15 +169,30 @@ fn parse_derive_input(derive_input: ast::TokenTree) -> Result<FxHashSet<String>,
169169 if left_paren. kind ( ) == SyntaxKind :: L_PAREN
170170 && right_paren. kind ( ) == SyntaxKind :: R_PAREN =>
171171 {
172- Ok ( derive_input
172+ let mut input_derives = FxHashSet :: default ( ) ;
173+ let mut current_derive = String :: new ( ) ;
174+ for token in derive_input
173175 . syntax ( )
174176 . 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)
181196 }
182197 _ => Err ( ( ) ) ,
183198 }
@@ -188,8 +203,7 @@ fn get_derive_names_in_scope(ctx: &CompletionContext) -> FxHashSet<String> {
188203 ctx. scope ( ) . process_all_names ( & mut |name, scope_def| {
189204 if let hir:: ScopeDef :: MacroDef ( mac) = scope_def {
190205 if mac. is_derive_macro ( ) {
191- let name_string = name. to_string ( ) ;
192- result. insert ( name_string) ;
206+ result. insert ( name. to_string ( ) ) ;
193207 }
194208 }
195209 } ) ;
@@ -321,65 +335,65 @@ mod tests {
321335 assert_debug_snapshot ! (
322336 do_attr_completion(
323337 r"
324- #[derive(Whatever , PartialEq, <|>)]
338+ #[derive(serde::Serialize , PartialEq, <|>)]
325339 struct Test {}
326340 " ,
327341 ) ,
328342 @r###"
329343 [
330344 CompletionItem {
331345 label: "Clone",
332- source_range: 51..51 ,
333- delete: 51..51 ,
346+ source_range: 59..59 ,
347+ delete: 59..59 ,
334348 insert: "Clone",
335349 kind: Attribute,
336350 },
337351 CompletionItem {
338352 label: "Copy, Clone",
339- source_range: 51..51 ,
340- delete: 51..51 ,
353+ source_range: 59..59 ,
354+ delete: 59..59 ,
341355 insert: "Copy, Clone",
342356 kind: Attribute,
343357 },
344358 CompletionItem {
345359 label: "Debug",
346- source_range: 51..51 ,
347- delete: 51..51 ,
360+ source_range: 59..59 ,
361+ delete: 59..59 ,
348362 insert: "Debug",
349363 kind: Attribute,
350364 },
351365 CompletionItem {
352366 label: "Default",
353- source_range: 51..51 ,
354- delete: 51..51 ,
367+ source_range: 59..59 ,
368+ delete: 59..59 ,
355369 insert: "Default",
356370 kind: Attribute,
357371 },
358372 CompletionItem {
359373 label: "Eq",
360- source_range: 51..51 ,
361- delete: 51..51 ,
374+ source_range: 59..59 ,
375+ delete: 59..59 ,
362376 insert: "Eq",
363377 kind: Attribute,
364378 },
365379 CompletionItem {
366380 label: "Hash",
367- source_range: 51..51 ,
368- delete: 51..51 ,
381+ source_range: 59..59 ,
382+ delete: 59..59 ,
369383 insert: "Hash",
370384 kind: Attribute,
371385 },
372386 CompletionItem {
373387 label: "Ord, PartialOrd, Eq",
374- source_range: 51..51 ,
375- delete: 51..51 ,
388+ source_range: 59..59 ,
389+ delete: 59..59 ,
376390 insert: "Ord, PartialOrd, Eq",
377391 kind: Attribute,
378392 },
379393 CompletionItem {
380394 label: "PartialOrd",
381- source_range: 51..51 ,
382- delete: 51..51 ,
395+ source_range: 59..59 ,
396+ delete: 59..59 ,
383397 insert: "PartialOrd",
384398 kind: Attribute,
385399 },
0 commit comments