Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/collector.rs')
-rw-r--r--crates/hir-def/src/nameres/collector.rs193
1 files changed, 81 insertions, 112 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 0c3274d849..a2ce538356 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -27,10 +27,11 @@ use triomphe::Arc;
use crate::{
AdtId, AssocItemId, AstId, AstIdWithPath, ConstLoc, CrateRootModuleId, EnumLoc, ExternBlockLoc,
- ExternCrateId, ExternCrateLoc, FunctionId, FunctionLoc, ImplLoc, Intern, ItemContainerId,
- LocalModuleId, Lookup, Macro2Id, Macro2Loc, MacroExpander, MacroId, MacroRulesId,
- MacroRulesLoc, MacroRulesLocFlags, ModuleDefId, ModuleId, ProcMacroId, ProcMacroLoc, StaticLoc,
- StructLoc, TraitAliasLoc, TraitLoc, TypeAliasLoc, UnionLoc, UnresolvedMacro, UseId, UseLoc,
+ ExternCrateId, ExternCrateLoc, FunctionId, FunctionLoc, FxIndexMap, ImplLoc, Intern,
+ ItemContainerId, LocalModuleId, Lookup, Macro2Id, Macro2Loc, MacroExpander, MacroId,
+ MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ModuleDefId, ModuleId, ProcMacroId,
+ ProcMacroLoc, StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, UnionLoc, UnresolvedMacro, UseId,
+ UseLoc,
attr::Attrs,
db::DefDatabase,
item_scope::{GlobId, ImportId, ImportOrExternCrate, PerNsGlobImports},
@@ -69,7 +70,7 @@ pub(super) fn collect_defs(
// populate external prelude and dependency list
let mut deps =
- FxHashMap::with_capacity_and_hasher(krate.dependencies.len(), Default::default());
+ FxIndexMap::with_capacity_and_hasher(krate.dependencies.len(), Default::default());
for dep in &krate.dependencies {
tracing::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id);
@@ -220,7 +221,7 @@ struct DefCollector<'db> {
/// Set only in case of blocks.
crate_local_def_map: Option<&'db LocalDefMap>,
// The dependencies of the current crate, including optional deps like `test`.
- deps: FxHashMap<Name, BuiltDependency>,
+ deps: FxIndexMap<Name, BuiltDependency>,
glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility, GlobId)>>,
unresolved_imports: Vec<ImportDirective>,
indeterminate_imports: Vec<(ImportDirective, PerNs)>,
@@ -261,20 +262,20 @@ impl<'db> DefCollector<'db> {
// Process other crate-level attributes.
for attr in &*attrs {
- if let Some(cfg) = attr.cfg() {
- if self.cfg_options.check(&cfg) == Some(false) {
- process = false;
- break;
- }
+ if let Some(cfg) = attr.cfg()
+ && self.cfg_options.check(&cfg) == Some(false)
+ {
+ process = false;
+ break;
}
let Some(attr_name) = attr.path.as_ident() else { continue };
match () {
() if *attr_name == sym::recursion_limit => {
- if let Some(limit) = attr.string_value() {
- if let Ok(limit) = limit.as_str().parse() {
- crate_data.recursion_limit = Some(limit);
- }
+ if let Some(limit) = attr.string_value()
+ && let Ok(limit) = limit.as_str().parse()
+ {
+ crate_data.recursion_limit = Some(limit);
}
}
() if *attr_name == sym::crate_type => {
@@ -297,12 +298,6 @@ impl<'db> DefCollector<'db> {
);
crate_data.unstable_features.extend(features);
}
- () if *attr_name == sym::register_attr => {
- if let Some(ident) = attr.single_ident_value() {
- crate_data.registered_attrs.push(ident.sym.clone());
- cov_mark::hit!(register_attr);
- }
- }
() if *attr_name == sym::register_tool => {
if let Some(ident) = attr.single_ident_value() {
crate_data.registered_tools.push(ident.sym.clone());
@@ -332,7 +327,9 @@ impl<'db> DefCollector<'db> {
let skip = dep.is_sysroot()
&& match dep.crate_id.data(self.db).origin {
CrateOrigin::Lang(LangCrateOrigin::Core) => crate_data.no_core,
- CrateOrigin::Lang(LangCrateOrigin::Std) => crate_data.no_std,
+ CrateOrigin::Lang(LangCrateOrigin::Std) => {
+ crate_data.no_core || crate_data.no_std
+ }
_ => false,
};
if skip {
@@ -1188,56 +1185,44 @@ impl<'db> DefCollector<'db> {
// Multiple globs may import the same item and they may override visibility from
// previously resolved globs. Handle overrides here and leave the rest to
// `ItemScope::push_res_with_import()`.
- if let Some(def) = defs.types {
- if let Some(prev_def) = prev_defs.types {
- if def.def == prev_def.def
- && self.from_glob_import.contains_type(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // This import is being handled here, don't pass it down to
- // `ItemScope::push_res_with_import()`.
- defs.types = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_types(name, def.vis);
- }
- }
+ if let Some(def) = defs.types
+ && let Some(prev_def) = prev_defs.types
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_type(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // This import is being handled here, don't pass it down to
+ // `ItemScope::push_res_with_import()`.
+ defs.types = None;
+ self.def_map.modules[module_id].scope.update_visibility_types(name, def.vis);
}
- if let Some(def) = defs.values {
- if let Some(prev_def) = prev_defs.values {
- if def.def == prev_def.def
- && self.from_glob_import.contains_value(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // See comment above.
- defs.values = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_values(name, def.vis);
- }
- }
+ if let Some(def) = defs.values
+ && let Some(prev_def) = prev_defs.values
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_value(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // See comment above.
+ defs.values = None;
+ self.def_map.modules[module_id].scope.update_visibility_values(name, def.vis);
}
- if let Some(def) = defs.macros {
- if let Some(prev_def) = prev_defs.macros {
- if def.def == prev_def.def
- && self.from_glob_import.contains_macro(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // See comment above.
- defs.macros = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_macros(name, def.vis);
- }
- }
+ if let Some(def) = defs.macros
+ && let Some(prev_def) = prev_defs.macros
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_macro(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // See comment above.
+ defs.macros = None;
+ self.def_map.modules[module_id].scope.update_visibility_macros(name, def.vis);
}
}
@@ -1392,15 +1377,14 @@ impl<'db> DefCollector<'db> {
Resolved::Yes
};
- if let Some(ident) = path.as_ident() {
- if let Some(helpers) = self.def_map.derive_helpers_in_scope.get(&ast_id) {
- if helpers.iter().any(|(it, ..)| it == ident) {
- cov_mark::hit!(resolved_derive_helper);
- // Resolved to derive helper. Collect the item's attributes again,
- // starting after the derive helper.
- return recollect_without(self);
- }
- }
+ if let Some(ident) = path.as_ident()
+ && let Some(helpers) = self.def_map.derive_helpers_in_scope.get(&ast_id)
+ && helpers.iter().any(|(it, ..)| it == ident)
+ {
+ cov_mark::hit!(resolved_derive_helper);
+ // Resolved to derive helper. Collect the item's attributes again,
+ // starting after the derive helper.
+ return recollect_without(self);
}
let def = match resolver_def_id(path) {
@@ -1729,12 +1713,12 @@ impl ModCollector<'_, '_> {
let mut process_mod_item = |item: ModItemId| {
let attrs = self.item_tree.attrs(db, krate, item.ast_id());
- if let Some(cfg) = attrs.cfg() {
- if !self.is_cfg_enabled(&cfg) {
- let ast_id = item.ast_id().erase();
- self.emit_unconfigured_diagnostic(InFile::new(self.file_id(), ast_id), &cfg);
- return;
- }
+ if let Some(cfg) = attrs.cfg()
+ && !self.is_cfg_enabled(&cfg)
+ {
+ let ast_id = item.ast_id().erase();
+ self.emit_unconfigured_diagnostic(InFile::new(self.file_id(), ast_id), &cfg);
+ return;
}
if let Err(()) = self.resolve_attributes(&attrs, item, container) {
@@ -1871,14 +1855,13 @@ impl ModCollector<'_, '_> {
if self.def_collector.def_map.block.is_none()
&& self.def_collector.is_proc_macro
&& self.module_id == DefMap::ROOT
+ && let Some(proc_macro) = attrs.parse_proc_macro_decl(&it.name)
{
- if let Some(proc_macro) = attrs.parse_proc_macro_decl(&it.name) {
- self.def_collector.export_proc_macro(
- proc_macro,
- InFile::new(self.file_id(), id),
- fn_id,
- );
- }
+ self.def_collector.export_proc_macro(
+ proc_macro,
+ InFile::new(self.file_id(), id),
+ fn_id,
+ );
}
update_def(self.def_collector, fn_id.into(), &it.name, vis, false);
@@ -1968,20 +1951,6 @@ impl ModCollector<'_, '_> {
false,
);
}
- ModItemId::TraitAlias(id) => {
- let it = &self.item_tree[id];
-
- let vis = resolve_vis(def_map, local_def_map, &self.item_tree[it.visibility]);
- update_def(
- self.def_collector,
- TraitAliasLoc { container: module, id: InFile::new(self.file_id(), id) }
- .intern(db)
- .into(),
- &it.name,
- vis,
- false,
- );
- }
ModItemId::TypeAlias(id) => {
let it = &self.item_tree[id];
@@ -2419,13 +2388,13 @@ impl ModCollector<'_, '_> {
macro_id,
&self.item_tree[mac.visibility],
);
- if let Some(helpers) = helpers_opt {
- if self.def_collector.def_map.block.is_none() {
- Arc::get_mut(&mut self.def_collector.def_map.data)
- .unwrap()
- .exported_derives
- .insert(macro_id.into(), helpers);
- }
+ if let Some(helpers) = helpers_opt
+ && self.def_collector.def_map.block.is_none()
+ {
+ Arc::get_mut(&mut self.def_collector.def_map.data)
+ .unwrap()
+ .exported_derives
+ .insert(macro_id.into(), helpers);
}
}
@@ -2578,7 +2547,7 @@ mod tests {
def_map,
local_def_map: LocalDefMap::default(),
crate_local_def_map: None,
- deps: FxHashMap::default(),
+ deps: FxIndexMap::default(),
glob_imports: FxHashMap::default(),
unresolved_imports: Vec::new(),
indeterminate_imports: Vec::new(),