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.rs48
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);