Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_db/src/defs.rs')
| -rw-r--r-- | crates/ide_db/src/defs.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index effa694aae..5bc8e8764f 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -12,10 +12,10 @@ use hir::{ }; use syntax::{ ast::{self, AstNode}, - match_ast, SyntaxKind, SyntaxNode, SyntaxToken, + match_ast, AstToken, SyntaxKind, SyntaxNode, SyntaxToken, }; -use crate::{helpers::try_resolve_derive_input_at, RootDatabase}; +use crate::{helpers::try_resolve_derive_input, RootDatabase}; // FIXME: a more precise name would probably be `Symbol`? #[derive(Debug, PartialEq, Eq, Copy, Clone, Hash)] @@ -38,19 +38,20 @@ impl Definition { Some(parent) => parent, None => return Default::default(), }; - let attr = parent - .ancestors() - .find_map(ast::TokenTree::cast) - .and_then(|tt| tt.parent_meta()) - .and_then(|meta| meta.parent_attr()); - if let Some(attr) = attr { - try_resolve_derive_input_at(&sema, &attr, &token) - .map(Definition::Macro) - .into_iter() - .collect() - } else { - Self::from_node(sema, &parent) + if let Some(ident) = ast::Ident::cast(token.clone()) { + let attr = parent + .ancestors() + .find_map(ast::TokenTree::cast) + .and_then(|tt| tt.parent_meta()) + .and_then(|meta| meta.parent_attr()); + if let Some(attr) = attr { + return try_resolve_derive_input(&sema, &attr, &ident) + .map(Into::into) + .into_iter() + .collect(); + } } + Self::from_node(sema, &parent) } pub fn from_node(sema: &Semantics<RootDatabase>, node: &SyntaxNode) -> ArrayVec<Definition, 2> { |