Fix derive argument parsing

This commit is contained in:
Kirill Bulatov 2020-05-02 23:45:44 +03:00
parent 9f0ed7ed92
commit 2fd054f276

View file

@ -169,15 +169,30 @@ fn parse_derive_input(derive_input: ast::TokenTree) -> Result<FxHashSet<String>,
if left_paren.kind() == SyntaxKind::L_PAREN if left_paren.kind() == SyntaxKind::L_PAREN
&& right_paren.kind() == SyntaxKind::R_PAREN => && right_paren.kind() == SyntaxKind::R_PAREN =>
{ {
Ok(derive_input let mut input_derives = FxHashSet::default();
let mut current_derive = String::new();
for token in derive_input
.syntax() .syntax()
.children_with_tokens() .children_with_tokens()
.filter_map(|child| child.into_token()) .filter_map(|token| token.into_token())
.skip_while(|child| child != &left_paren) .skip_while(|token| token != &left_paren)
.take_while(|child| child != &right_paren) .skip(1)
.filter(|child| child.kind() == SyntaxKind::IDENT) .take_while(|token| token != &right_paren)
.map(|child| child.to_string()) {
.collect()) if SyntaxKind::COMMA == token.kind() {
if !current_derive.is_empty() {
input_derives.insert(current_derive);
current_derive = String::new();
}
} else {
current_derive.push_str(token.to_string().trim());
}
}
if !current_derive.is_empty() {
input_derives.insert(current_derive);
}
Ok(input_derives)
} }
_ => Err(()), _ => Err(()),
} }
@ -188,8 +203,7 @@ fn get_derive_names_in_scope(ctx: &CompletionContext) -> FxHashSet<String> {
ctx.scope().process_all_names(&mut |name, scope_def| { ctx.scope().process_all_names(&mut |name, scope_def| {
if let hir::ScopeDef::MacroDef(mac) = scope_def { if let hir::ScopeDef::MacroDef(mac) = scope_def {
if mac.is_derive_macro() { if mac.is_derive_macro() {
let name_string = name.to_string(); result.insert(name.to_string());
result.insert(name_string);
} }
} }
}); });
@ -321,7 +335,7 @@ mod tests {
assert_debug_snapshot!( assert_debug_snapshot!(
do_attr_completion( do_attr_completion(
r" r"
#[derive(Whatever, PartialEq, <|>)] #[derive(serde::Serialize, PartialEq, <|>)]
struct Test {} struct Test {}
", ",
), ),
@ -329,57 +343,57 @@ mod tests {
[ [
CompletionItem { CompletionItem {
label: "Clone", label: "Clone",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Clone", insert: "Clone",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Copy, Clone", label: "Copy, Clone",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Copy, Clone", insert: "Copy, Clone",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Debug", label: "Debug",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Debug", insert: "Debug",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Default", label: "Default",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Default", insert: "Default",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Eq", label: "Eq",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Eq", insert: "Eq",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Hash", label: "Hash",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Hash", insert: "Hash",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "Ord, PartialOrd, Eq", label: "Ord, PartialOrd, Eq",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "Ord, PartialOrd, Eq", insert: "Ord, PartialOrd, Eq",
kind: Attribute, kind: Attribute,
}, },
CompletionItem { CompletionItem {
label: "PartialOrd", label: "PartialOrd",
source_range: 51..51, source_range: 59..59,
delete: 51..51, delete: 59..59,
insert: "PartialOrd", insert: "PartialOrd",
kind: Attribute, kind: Attribute,
}, },