mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Fix derive argument parsing
This commit is contained in:
parent
9f0ed7ed92
commit
2fd054f276
1 changed files with 40 additions and 26 deletions
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue