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.rs99
1 files changed, 22 insertions, 77 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 5f0cf9c4ac..9ffc218818 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -32,8 +32,8 @@ use crate::{
derive_macro_as_call_id,
item_scope::{ImportType, PerNsGlobImports},
item_tree::{
- self, FieldAstId, Fields, FileItemTreeId, ImportKind, ItemTree, ItemTreeId, ItemTreeNode,
- MacroCall, MacroDef, MacroRules, Mod, ModItem, ModKind, TreeId,
+ self, Fields, FileItemTreeId, ImportKind, ItemTree, ItemTreeId, ItemTreeNode, MacroCall,
+ MacroDef, MacroRules, Mod, ModItem, ModKind, TreeId,
},
macro_call_as_call_id, macro_id_to_def_id,
nameres::{
@@ -1511,10 +1511,7 @@ impl ModCollector<'_, '_> {
let attrs = self.item_tree.attrs(self.def_collector.db, krate, item.into());
if let Some(cfg) = attrs.cfg() {
if !self.is_cfg_enabled(&cfg) {
- self.emit_unconfigured_diagnostic(
- InFile::new(self.file_id(), item.ast_id(&self.item_tree).upcast()),
- &cfg,
- );
+ self.emit_unconfigured_diagnostic(item, &cfg);
continue;
}
}
@@ -1526,20 +1523,22 @@ impl ModCollector<'_, '_> {
}
let db = self.def_collector.db;
- let module_id = self.module_id;
- let module = self.def_collector.def_map.module_id(module_id);
+ let module = self.def_collector.def_map.module_id(self.module_id);
+ let def_map = &mut self.def_collector.def_map;
let update_def =
|def_collector: &mut DefCollector<'_>, id, name: &Name, vis, has_constructor| {
- def_collector.def_map.modules[module_id].scope.declare(id);
+ def_collector.def_map.modules[self.module_id].scope.declare(id);
def_collector.update(
- module_id,
+ self.module_id,
&[(Some(name.clone()), PerNs::from_def(id, vis, has_constructor))],
vis,
ImportType::Named,
)
};
let resolve_vis = |def_map: &DefMap, visibility| {
- def_map.resolve_visibility(db, module_id, visibility).unwrap_or(Visibility::Public)
+ def_map
+ .resolve_visibility(db, self.module_id, visibility)
+ .unwrap_or(Visibility::Public)
};
match item {
@@ -1595,7 +1594,6 @@ impl ModCollector<'_, '_> {
let fn_id =
FunctionLoc { container, id: ItemTreeId::new(self.tree_id, id) }.intern(db);
- let def_map = &self.def_collector.def_map;
let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
if self.def_collector.is_proc_macro {
if self.module_id == def_map.root {
@@ -1616,10 +1614,7 @@ impl ModCollector<'_, '_> {
ModItem::Struct(id) => {
let it = &self.item_tree[id];
- self.process_fields(&it.fields);
-
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
StructLoc { container: module, id: ItemTreeId::new(self.tree_id, id) }
@@ -1633,10 +1628,7 @@ impl ModCollector<'_, '_> {
ModItem::Union(id) => {
let it = &self.item_tree[id];
- self.process_fields(&it.fields);
-
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
UnionLoc { container: module, id: ItemTreeId::new(self.tree_id, id) }
@@ -1650,21 +1642,7 @@ impl ModCollector<'_, '_> {
ModItem::Enum(id) => {
let it = &self.item_tree[id];
- for id in it.variants.clone() {
- let variant = &self.item_tree[id];
- let attrs = self.item_tree.attrs(self.def_collector.db, krate, id.into());
- if let Some(cfg) = attrs.cfg() {
- if !self.is_cfg_enabled(&cfg) {
- self.emit_unconfigured_diagnostic(
- InFile::new(self.file_id(), variant.ast_id.upcast()),
- &cfg,
- );
- }
- }
- }
-
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
EnumLoc { container: module, id: ItemTreeId::new(self.tree_id, id) }
@@ -1682,10 +1660,7 @@ impl ModCollector<'_, '_> {
match &it.name {
Some(name) => {
- let vis = resolve_vis(
- &self.def_collector.def_map,
- &self.item_tree[it.visibility],
- );
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(self.def_collector, const_id.into(), name, vis, false);
}
None => {
@@ -1699,8 +1674,7 @@ impl ModCollector<'_, '_> {
ModItem::Static(id) => {
let it = &self.item_tree[id];
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
StaticLoc { container, id: ItemTreeId::new(self.tree_id, id) }
@@ -1714,8 +1688,7 @@ impl ModCollector<'_, '_> {
ModItem::Trait(id) => {
let it = &self.item_tree[id];
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
TraitLoc { container: module, id: ItemTreeId::new(self.tree_id, id) }
@@ -1729,8 +1702,7 @@ impl ModCollector<'_, '_> {
ModItem::TypeAlias(id) => {
let it = &self.item_tree[id];
- let vis =
- resolve_vis(&self.def_collector.def_map, &self.item_tree[it.visibility]);
+ let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(
self.def_collector,
TypeAliasLoc { container, id: ItemTreeId::new(self.tree_id, id) }
@@ -2143,44 +2115,17 @@ impl ModCollector<'_, '_> {
}
}
- fn process_fields(&mut self, fields: &Fields) {
- match fields {
- Fields::Record(range) | Fields::Tuple(range) => {
- for id in range.clone() {
- let field = &self.item_tree[id];
- let attrs = self.item_tree.attrs(
- self.def_collector.db,
- self.def_collector.def_map.krate,
- id.into(),
- );
- if let Some(cfg) = attrs.cfg() {
- if !self.is_cfg_enabled(&cfg) {
- self.emit_unconfigured_diagnostic(
- InFile::new(
- self.file_id(),
- match field.ast_id {
- FieldAstId::Record(it) => it.upcast(),
- FieldAstId::Tuple(it) => it.upcast(),
- },
- ),
- &cfg,
- );
- }
- }
- }
- }
- Fields::Unit => {}
- }
- }
-
fn is_cfg_enabled(&self, cfg: &CfgExpr) -> bool {
self.def_collector.cfg_options.check(cfg) != Some(false)
}
- fn emit_unconfigured_diagnostic(&mut self, ast: AstId<ast::AnyHasAttrs>, cfg: &CfgExpr) {
+ fn emit_unconfigured_diagnostic(&mut self, item: ModItem, cfg: &CfgExpr) {
+ let ast_id = item.ast_id(self.item_tree);
+
+ let ast_id = InFile::new(self.file_id(), ast_id.upcast());
self.def_collector.def_map.diagnostics.push(DefDiagnostic::unconfigured_code(
self.module_id,
- ast,
+ ast_id,
cfg.clone(),
self.def_collector.cfg_options.clone(),
));