Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/symbols.rs')
| -rw-r--r-- | crates/hir/src/symbols.rs | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/crates/hir/src/symbols.rs b/crates/hir/src/symbols.rs index 857c9e0ed9..858293a345 100644 --- a/crates/hir/src/symbols.rs +++ b/crates/hir/src/symbols.rs @@ -1,16 +1,15 @@ //! File symbol extraction. use base_db::FileRange; -use either::Either; use hir_def::{ item_tree::ItemTreeNode, src::HasSource, AdtId, AssocItemId, AssocItemLoc, DefWithBodyId, - ImplId, ItemContainerId, ItemLoc, Lookup, ModuleDefId, ModuleId, TraitId, + ImplId, ItemContainerId, Lookup, MacroId, ModuleDefId, ModuleId, TraitId, }; use hir_expand::{HirFileId, InFile}; use hir_ty::db::HirDatabase; use syntax::{ast::HasName, AstNode, SmolStr, SyntaxNode, SyntaxNodePtr}; -use crate::{HasSource as _, MacroDef, Module, Semantics}; +use crate::{Module, Semantics}; /// The actual data that is stored in the index. It should be as compact as /// possible. @@ -157,6 +156,11 @@ impl<'a> SymbolCollector<'a> { ModuleDefId::TypeAliasId(id) => { self.push_decl_assoc(id, FileSymbolKind::TypeAlias); } + ModuleDefId::MacroId(id) => match id { + MacroId::Macro2Id(id) => self.push_decl(id, FileSymbolKind::Macro), + MacroId::MacroRulesId(id) => self.push_decl(id, FileSymbolKind::Macro), + MacroId::ProcMacroId(id) => self.push_decl(id, FileSymbolKind::Macro), + }, // Don't index these. ModuleDefId::BuiltinType(_) => {} ModuleDefId::EnumVariantId(_) => {} @@ -171,8 +175,11 @@ impl<'a> SymbolCollector<'a> { self.collect_from_body(const_id); } - for macro_def_id in scope.macro_declarations() { - self.push_decl_macro(macro_def_id.into()); + for (_, id) in scope.legacy_macros() { + let loc = id.lookup(self.db.upcast()); + if loc.container == module_id { + self.push_decl(id, FileSymbolKind::Macro); + } } } @@ -283,11 +290,11 @@ impl<'a> SymbolCollector<'a> { }) } - fn push_decl<L, T>(&mut self, id: L, kind: FileSymbolKind) + fn push_decl<L>(&mut self, id: L, kind: FileSymbolKind) where - L: Lookup<Data = ItemLoc<T>>, - T: ItemTreeNode, - <T as ItemTreeNode>::Source: HasName, + L: Lookup, + <L as Lookup>::Data: HasSource, + <<L as Lookup>::Data as HasSource>::Value: HasName, { self.push_file_symbol(|s| { let loc = id.lookup(s.db.upcast()); @@ -328,29 +335,6 @@ impl<'a> SymbolCollector<'a> { }) } - fn push_decl_macro(&mut self, macro_def: MacroDef) { - self.push_file_symbol(|s| { - let name = macro_def.name(s.db)?.as_text()?; - let source = macro_def.source(s.db)?; - - let (ptr, name_ptr) = match source.value { - Either::Left(m) => { - (SyntaxNodePtr::new(m.syntax()), SyntaxNodePtr::new(m.name()?.syntax())) - } - Either::Right(f) => { - (SyntaxNodePtr::new(f.syntax()), SyntaxNodePtr::new(f.name()?.syntax())) - } - }; - - Some(FileSymbol { - name, - kind: FileSymbolKind::Macro, - container_name: s.current_container_name(), - loc: DeclarationLocation { hir_file_id: source.file_id, name_ptr, ptr }, - }) - }) - } - fn push_file_symbol(&mut self, f: impl FnOnce(&Self) -> Option<FileSymbol>) { if let Some(file_symbol) = f(self) { self.symbols.push(file_symbol); |