Skip to content

Commit 2fd054f

Browse files
Fix derive argument parsing
1 parent 9f0ed7e commit 2fd054f

File tree

1 file changed

+40
-26
lines changed

1 file changed

+40
-26
lines changed

crates/ra_ide/src/completion/complete_attribute.rs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)