diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 330817077390..ae494c86e429 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -44,9 +44,9 @@ use hir_def::{ nameres, per_ns::PerNs, resolver::{HasResolver, Resolver}, - AssocItemId, AttrDefId, ConstId, ConstParamId, EnumId, FunctionId, GenericDefId, HasModule, - ImplId, LifetimeParamId, LocalEnumVariantId, LocalFieldId, StaticId, StructId, TraitId, - TypeAliasId, TypeParamId, UnionId, + AttrDefId, ConstId, ConstParamId, EnumId, FunctionId, GenericDefId, HasModule, ImplId, + LifetimeParamId, LocalEnumVariantId, LocalFieldId, StaticId, StructId, TraitId, TypeAliasId, + TypeParamId, UnionId, }; use hir_expand::{name::name, MacroCallKind, MacroDefId, MacroDefKind}; use hir_ty::{ @@ -115,6 +115,7 @@ pub use { visibility::Visibility, AdtId, AssocContainerId, + AssocItemId, AssocItemLoc, DefWithBodyId, ItemLoc, diff --git a/crates/ide_db/src/symbol_index.rs b/crates/ide_db/src/symbol_index.rs index 3ff45b4b08d4..01318b103e8c 100644 --- a/crates/ide_db/src/symbol_index.rs +++ b/crates/ide_db/src/symbol_index.rs @@ -34,8 +34,9 @@ use base_db::{ }; use fst::{self, Streamer}; use hir::{ - db::DefDatabase, AdtId, AssocContainerId, AssocItemLoc, DefHasSource, DefWithBodyId, HirFileId, - InFile, ItemLoc, ItemScope, ItemTreeNode, Lookup, ModuleData, ModuleDefId, ModuleId, Semantics, + db::DefDatabase, AdtId, AssocContainerId, AssocItemId, AssocItemLoc, DefHasSource, + DefWithBodyId, HirFileId, InFile, ItemLoc, ItemScope, ItemTreeNode, Lookup, ModuleData, + ModuleDefId, ModuleId, Semantics, }; use rayon::prelude::*; use rustc_hash::{FxHashMap, FxHashSet}; @@ -209,21 +210,18 @@ pub fn crate_symbols(db: &RootDatabase, krate: CrateId, query: Query) -> Vec>(); query.search(&buf) } fn module_ids_for_crate(db: &RootDatabase, krate: CrateId) -> Vec { let def_map = db.crate_def_map(krate); - let mut module_ids = Vec::new(); - let mut modules = vec![def_map.root()]; - while let Some(module) = modules.pop() { - let data = &def_map[module]; - module_ids.push(def_map.module_id(module)); - modules.extend(data.children.values()); - } - - module_ids + def_map.modules().map(|(id, _)| def_map.module_id(id)).collect() } pub fn index_resolve(db: &RootDatabase, name: &str) -> Vec { @@ -547,7 +545,9 @@ fn collect_symbols_from_item_scope( symbols: &mut Vec, bodies_to_traverse: &mut Vec<(Option, DefWithBodyId)>, container_name: &Option| { - let symbols_iter = scope + let mut trait_ids = Vec::new(); + + let scope_declaration_symbols = scope .declarations() .filter_map(|module_def_id| match module_def_id { ModuleDefId::ModuleId(module_id) => decl_module(db, module_id), @@ -584,7 +584,10 @@ fn collect_symbols_from_item_scope( )); symbol } - ModuleDefId::TraitId(trait_id) => decl(db, trait_id, FileSymbolKind::Trait), + ModuleDefId::TraitId(trait_id) => { + trait_ids.push(trait_id); + decl(db, trait_id, FileSymbolKind::Trait) + } ModuleDefId::TypeAliasId(alias_id) => { decl_assoc(db, alias_id, FileSymbolKind::TypeAlias) } @@ -601,7 +604,47 @@ fn collect_symbols_from_item_scope( s }); - symbols.extend(symbols_iter); + symbols.extend(scope_declaration_symbols); + + // todo: we need to merge in container name to these too. + // also clean this up generally tooooo. + let scope_impl_symbols = scope + .impls() + .map(|impl_id| db.impl_data(impl_id)) + .flat_map(|d| d.items.clone()) // xx: clean up this clone?? + .filter_map(|assoc_item_id| match assoc_item_id { + AssocItemId::FunctionId(function_id) => { + decl_assoc(db, function_id, FileSymbolKind::Function) + } + AssocItemId::ConstId(const_id) => { + decl_assoc(db, const_id, FileSymbolKind::Const) + } + AssocItemId::TypeAliasId(type_alias_id) => { + decl_assoc(db, type_alias_id, FileSymbolKind::TypeAlias) + } + }); + + symbols.extend(scope_impl_symbols); + + // todo: we need to merge in container name to these too. + // also clean this up generally tooooo. + let scope_trait_symbols = trait_ids + .into_iter() + .map(|trait_id| db.trait_data(trait_id)) + .flat_map(|d| d.items.clone()) + .filter_map(|(_, assoc_item_id)| match assoc_item_id { + AssocItemId::FunctionId(function_id) => { + decl_assoc(db, function_id, FileSymbolKind::Function) + } + AssocItemId::ConstId(const_id) => { + decl_assoc(db, const_id, FileSymbolKind::Const) + } + AssocItemId::TypeAliasId(type_alias_id) => { + decl_assoc(db, type_alias_id, FileSymbolKind::TypeAlias) + } + }); + + symbols.extend(scope_trait_symbols); for const_id in scope.unnamed_consts() { // since unnamed consts don't really have a name, we'll inherit parent scope's symbol name.