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.rs77
1 files changed, 39 insertions, 38 deletions
diff --git a/crates/hir/src/symbols.rs b/crates/hir/src/symbols.rs
index 9b165d1655..a6b8ed70c3 100644
--- a/crates/hir/src/symbols.rs
+++ b/crates/hir/src/symbols.rs
@@ -15,6 +15,7 @@ use hir_ty::{
db::HirDatabase,
display::{hir_display_with_types_map, HirDisplay},
};
+use intern::Symbol;
use rustc_hash::FxHashMap;
use span::Edition;
use syntax::{ast::HasName, AstNode, AstPtr, SmolStr, SyntaxNode, SyntaxNodePtr, ToSmolStr};
@@ -27,7 +28,7 @@ pub type FxIndexSet<T> = indexmap::IndexSet<T, std::hash::BuildHasherDefault<rus
/// possible.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct FileSymbol {
- pub name: SmolStr,
+ pub name: Symbol,
pub def: ModuleDef,
pub loc: DeclarationLocation,
pub container_name: Option<SmolStr>,
@@ -110,38 +111,38 @@ impl<'a> SymbolCollector<'a> {
}
fn collect_from_module(&mut self, module_id: ModuleId) {
- let push_decl = |this: &mut Self, def| {
+ let push_decl = |this: &mut Self, def, name| {
match def {
- ModuleDefId::ModuleId(id) => this.push_module(id),
+ ModuleDefId::ModuleId(id) => this.push_module(id, name),
ModuleDefId::FunctionId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
this.collect_from_body(id);
}
- ModuleDefId::AdtId(AdtId::StructId(id)) => this.push_decl(id, false),
- ModuleDefId::AdtId(AdtId::EnumId(id)) => this.push_decl(id, false),
- ModuleDefId::AdtId(AdtId::UnionId(id)) => this.push_decl(id, false),
+ ModuleDefId::AdtId(AdtId::StructId(id)) => this.push_decl(id, name, false),
+ ModuleDefId::AdtId(AdtId::EnumId(id)) => this.push_decl(id, name, false),
+ ModuleDefId::AdtId(AdtId::UnionId(id)) => this.push_decl(id, name, false),
ModuleDefId::ConstId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
this.collect_from_body(id);
}
ModuleDefId::StaticId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
this.collect_from_body(id);
}
ModuleDefId::TraitId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
this.collect_from_trait(id);
}
ModuleDefId::TraitAliasId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
}
ModuleDefId::TypeAliasId(id) => {
- this.push_decl(id, false);
+ this.push_decl(id, name, false);
}
ModuleDefId::MacroId(id) => match id {
- MacroId::Macro2Id(id) => this.push_decl(id, false),
- MacroId::MacroRulesId(id) => this.push_decl(id, false),
- MacroId::ProcMacroId(id) => this.push_decl(id, false),
+ MacroId::Macro2Id(id) => this.push_decl(id, name, false),
+ MacroId::MacroRulesId(id) => this.push_decl(id, name, false),
+ MacroId::ProcMacroId(id) => this.push_decl(id, name, false),
},
// Don't index these.
ModuleDefId::BuiltinType(_) => {}
@@ -172,7 +173,7 @@ impl<'a> SymbolCollector<'a> {
name_ptr,
};
this.symbols.insert(FileSymbol {
- name: name.as_str().into(),
+ name: name.symbol().clone(),
def: def.into(),
container_name: this.current_container_name.clone(),
loc: dec_loc,
@@ -201,7 +202,7 @@ impl<'a> SymbolCollector<'a> {
name_ptr,
};
this.symbols.insert(FileSymbol {
- name: name.as_str().into(),
+ name: name.symbol().clone(),
def: def.into(),
container_name: this.current_container_name.clone(),
loc: dec_loc,
@@ -242,7 +243,7 @@ impl<'a> SymbolCollector<'a> {
continue;
}
// self is a declaration
- push_decl(self, def)
+ push_decl(self, def, name)
}
for (name, Item { def, vis, import }) in scope.macros() {
@@ -253,7 +254,7 @@ impl<'a> SymbolCollector<'a> {
continue;
}
// self is a declaration
- push_decl(self, def.into())
+ push_decl(self, def.into(), name)
}
for (name, Item { def, vis, import }) in scope.values() {
@@ -264,20 +265,20 @@ impl<'a> SymbolCollector<'a> {
continue;
}
// self is a declaration
- push_decl(self, def)
+ push_decl(self, def, name)
}
for const_id in scope.unnamed_consts() {
self.collect_from_body(const_id);
}
- for (_, id) in scope.legacy_macros() {
+ for (name, id) in scope.legacy_macros() {
for &id in id {
if id.module(self.db.upcast()) == module_id {
match id {
- MacroId::Macro2Id(id) => self.push_decl(id, false),
- MacroId::MacroRulesId(id) => self.push_decl(id, false),
- MacroId::ProcMacroId(id) => self.push_decl(id, false),
+ MacroId::Macro2Id(id) => self.push_decl(id, name, false),
+ MacroId::MacroRulesId(id) => self.push_decl(id, name, false),
+ MacroId::ProcMacroId(id) => self.push_decl(id, name, false),
}
}
}
@@ -307,8 +308,8 @@ impl<'a> SymbolCollector<'a> {
.to_smolstr(),
);
self.with_container_name(impl_name, |s| {
- for &assoc_item_id in impl_data.items.iter() {
- s.push_assoc_item(assoc_item_id)
+ for &(ref name, assoc_item_id) in &impl_data.items {
+ s.push_assoc_item(assoc_item_id, name)
}
})
}
@@ -316,8 +317,8 @@ impl<'a> SymbolCollector<'a> {
fn collect_from_trait(&mut self, trait_id: TraitId) {
let trait_data = self.db.trait_data(trait_id);
self.with_container_name(Some(trait_data.name.as_str().into()), |s| {
- for &(_, assoc_item_id) in &trait_data.items {
- s.push_assoc_item(assoc_item_id);
+ for &(ref name, assoc_item_id) in &trait_data.items {
+ s.push_assoc_item(assoc_item_id, name);
}
});
}
@@ -350,15 +351,15 @@ impl<'a> SymbolCollector<'a> {
}
}
- fn push_assoc_item(&mut self, assoc_item_id: AssocItemId) {
+ fn push_assoc_item(&mut self, assoc_item_id: AssocItemId, name: &Name) {
match assoc_item_id {
- AssocItemId::FunctionId(id) => self.push_decl(id, true),
- AssocItemId::ConstId(id) => self.push_decl(id, true),
- AssocItemId::TypeAliasId(id) => self.push_decl(id, true),
+ AssocItemId::FunctionId(id) => self.push_decl(id, name, true),
+ AssocItemId::ConstId(id) => self.push_decl(id, name, true),
+ AssocItemId::TypeAliasId(id) => self.push_decl(id, name, true),
}
}
- fn push_decl<'db, L>(&mut self, id: L, is_assoc: bool)
+ fn push_decl<'db, L>(&mut self, id: L, name: &Name, is_assoc: bool)
where
L: Lookup<Database<'db> = dyn DefDatabase + 'db> + Into<ModuleDefId>,
<L as Lookup>::Data: HasSource,
@@ -377,7 +378,7 @@ impl<'a> SymbolCollector<'a> {
if let Some(attrs) = def.attrs(self.db) {
for alias in attrs.doc_aliases() {
self.symbols.insert(FileSymbol {
- name: alias.as_str().into(),
+ name: alias.clone(),
def,
loc: dec_loc.clone(),
container_name: self.current_container_name.clone(),
@@ -388,7 +389,7 @@ impl<'a> SymbolCollector<'a> {
}
self.symbols.insert(FileSymbol {
- name: name_node.text().into(),
+ name: name.symbol().clone(),
def,
container_name: self.current_container_name.clone(),
loc: dec_loc,
@@ -397,7 +398,7 @@ impl<'a> SymbolCollector<'a> {
});
}
- fn push_module(&mut self, module_id: ModuleId) {
+ fn push_module(&mut self, module_id: ModuleId, name: &Name) {
let def_map = module_id.def_map(self.db.upcast());
let module_data = &def_map[module_id.local_id];
let Some(declaration) = module_data.origin.declaration() else { return };
@@ -414,7 +415,7 @@ impl<'a> SymbolCollector<'a> {
if let Some(attrs) = def.attrs(self.db) {
for alias in attrs.doc_aliases() {
self.symbols.insert(FileSymbol {
- name: alias.as_str().into(),
+ name: alias.clone(),
def,
loc: dec_loc.clone(),
container_name: self.current_container_name.clone(),
@@ -425,7 +426,7 @@ impl<'a> SymbolCollector<'a> {
}
self.symbols.insert(FileSymbol {
- name: name_node.text().into(),
+ name: name.symbol().clone(),
def: ModuleDef::Module(module_id.into()),
container_name: self.current_container_name.clone(),
loc: dec_loc,