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.rs109
1 files changed, 65 insertions, 44 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 760f811ede..893ad47e24 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -3,7 +3,7 @@
//! `DefCollector::collect` contains the fixed-point iteration loop which
//! resolves imports and expands macros.
-use std::{cmp::Ordering, iter, mem};
+use std::{cmp::Ordering, iter, mem, ops::Not};
use base_db::{CrateId, Dependency, Edition, FileId};
use cfg::{CfgExpr, CfgOptions};
@@ -35,8 +35,8 @@ use crate::{
derive_macro_as_call_id,
item_scope::{ImportId, ImportOrExternCrate, ImportType, PerNsGlobImports},
item_tree::{
- self, ExternCrate, Fields, FileItemTreeId, ImportKind, ItemTree, ItemTreeId, ItemTreeNode,
- Macro2, MacroCall, MacroRules, Mod, ModItem, ModKind, TreeId,
+ self, ExternCrate, Fields, FileItemTreeId, ImportKind, ItemTree, ItemTreeId,
+ ItemTreeModItemNode, Macro2, MacroCall, MacroRules, Mod, ModItem, ModKind, TreeId,
},
macro_call_as_call_id, macro_call_as_call_id_with_eager,
nameres::{
@@ -1579,7 +1579,10 @@ impl ModCollector<'_, '_> {
let attrs = self.item_tree.attrs(db, krate, item.into());
if let Some(cfg) = attrs.cfg() {
if !self.is_cfg_enabled(&cfg) {
- self.emit_unconfigured_diagnostic(item.ast_id(self.item_tree).erase(), &cfg);
+ self.emit_unconfigured_diagnostic(
+ InFile::new(self.file_id(), item.ast_id(self.item_tree).erase()),
+ &cfg,
+ );
return;
}
}
@@ -1717,27 +1720,37 @@ impl ModCollector<'_, '_> {
let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
update_def(self.def_collector, enum_.into(), &it.name, vis, false);
+ let mut index = 0;
let variants = FileItemTreeId::range_iter(it.variants.clone())
.filter_map(|variant| {
- let attrs = self.item_tree.attrs(db, krate, variant.into());
- if let Some(cfg) = attrs.cfg() {
- if !self.is_cfg_enabled(&cfg) {
+ let is_enabled = self
+ .item_tree
+ .attrs(db, krate, variant.into())
+ .cfg()
+ .and_then(|cfg| self.is_cfg_enabled(&cfg).not().then_some(cfg))
+ .map_or(Ok(()), Err);
+ match is_enabled {
+ Err(cfg) => {
self.emit_unconfigured_diagnostic(
- self.item_tree[variant.index()].ast_id.erase(),
+ InFile::new(
+ self.file_id(),
+ self.item_tree[variant.index()].ast_id.erase(),
+ ),
&cfg,
);
- return None;
+ None
}
+ Ok(()) => Some({
+ let loc = EnumVariantLoc {
+ id: ItemTreeId::new(self.tree_id, variant),
+ parent: enum_,
+ index,
+ }
+ .intern(db);
+ index += 1;
+ loc
+ }),
}
-
- Some(
- EnumVariantLoc {
- container: module,
- id: ItemTreeId::new(self.tree_id, variant),
- parent: enum_,
- }
- .intern(db),
- )
})
.collect();
self.def_collector.def_map.enum_definitions.insert(enum_, variants);
@@ -1927,31 +1940,40 @@ impl ModCollector<'_, '_> {
let is_enabled = item_tree
.top_level_attrs(db, krate)
.cfg()
- .map_or(true, |cfg| self.is_cfg_enabled(&cfg));
- if is_enabled {
- let module_id = self.push_child_module(
- module.name.clone(),
- ast_id.value,
- Some((file_id, is_mod_rs)),
- &self.item_tree[module.visibility],
- module_id,
- );
- ModCollector {
- def_collector: self.def_collector,
- macro_depth: self.macro_depth,
- module_id,
- tree_id: TreeId::new(file_id.into(), None),
- item_tree: &item_tree,
- mod_dir,
+ .and_then(|cfg| self.is_cfg_enabled(&cfg).not().then_some(cfg))
+ .map_or(Ok(()), Err);
+ match is_enabled {
+ Err(cfg) => {
+ self.emit_unconfigured_diagnostic(
+ ast_id.map(|it| it.erase()),
+ &cfg,
+ );
}
- .collect_in_top_module(item_tree.top_level_items());
- let is_macro_use = is_macro_use
- || item_tree
- .top_level_attrs(db, krate)
- .by_key("macro_use")
- .exists();
- if is_macro_use {
- self.import_all_legacy_macros(module_id);
+ Ok(()) => {
+ let module_id = self.push_child_module(
+ module.name.clone(),
+ ast_id.value,
+ Some((file_id, is_mod_rs)),
+ &self.item_tree[module.visibility],
+ module_id,
+ );
+ ModCollector {
+ def_collector: self.def_collector,
+ macro_depth: self.macro_depth,
+ module_id,
+ tree_id: TreeId::new(file_id.into(), None),
+ item_tree: &item_tree,
+ mod_dir,
+ }
+ .collect_in_top_module(item_tree.top_level_items());
+ let is_macro_use = is_macro_use
+ || item_tree
+ .top_level_attrs(db, krate)
+ .by_key("macro_use")
+ .exists();
+ if is_macro_use {
+ self.import_all_legacy_macros(module_id);
+ }
}
}
}
@@ -2382,8 +2404,7 @@ impl ModCollector<'_, '_> {
self.def_collector.cfg_options.check(cfg) != Some(false)
}
- fn emit_unconfigured_diagnostic(&mut self, ast_id: ErasedFileAstId, cfg: &CfgExpr) {
- let ast_id = InFile::new(self.file_id(), ast_id);
+ fn emit_unconfigured_diagnostic(&mut self, ast_id: InFile<ErasedFileAstId>, cfg: &CfgExpr) {
self.def_collector.def_map.diagnostics.push(DefDiagnostic::unconfigured_code(
self.module_id,
ast_id,