Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/import_map.rs')
-rw-r--r--crates/hir-def/src/import_map.rs47
1 files changed, 30 insertions, 17 deletions
diff --git a/crates/hir-def/src/import_map.rs b/crates/hir-def/src/import_map.rs
index f31f355cfa..6c5d226cac 100644
--- a/crates/hir-def/src/import_map.rs
+++ b/crates/hir-def/src/import_map.rs
@@ -14,9 +14,10 @@ use triomphe::Arc;
use crate::{
AssocItemId, AttrDefId, Complete, FxIndexMap, ModuleDefId, ModuleId, TraitId,
+ attrs::AttrFlags,
db::DefDatabase,
item_scope::{ImportOrExternCrate, ItemInNs},
- nameres::{DefMap, assoc::TraitItems, crate_def_map},
+ nameres::{assoc::TraitItems, crate_def_map},
visibility::Visibility,
};
@@ -133,7 +134,7 @@ impl ImportMap {
let mut map = FxIndexMap::default();
// We look only into modules that are public(ly reexported), starting with the crate root.
- let root = def_map.module_id(DefMap::ROOT);
+ let root = def_map.root_module_id();
let mut worklist = vec![root];
let mut visited = FxHashSet::default();
@@ -141,13 +142,11 @@ impl ImportMap {
if !visited.insert(module) {
continue;
}
- let ext_def_map;
- let mod_data = if module.krate == krate {
- &def_map[module.local_id]
+ let mod_data = if module.krate(db) == krate {
+ &def_map[module]
} else {
// The crate might reexport a module defined in another crate.
- ext_def_map = module.def_map(db);
- &ext_def_map[module.local_id]
+ &module.def_map(db)[module]
};
let visible_items = mod_data.scope.entries().filter_map(|(name, per_ns)| {
@@ -165,17 +164,32 @@ impl ImportMap {
}
} else {
match item {
- ItemInNs::Types(id) | ItemInNs::Values(id) => id.try_into().ok(),
+ ItemInNs::Types(id) | ItemInNs::Values(id) => match id {
+ ModuleDefId::ModuleId(it) => Some(AttrDefId::ModuleId(it)),
+ ModuleDefId::FunctionId(it) => Some(it.into()),
+ ModuleDefId::AdtId(it) => Some(it.into()),
+ ModuleDefId::EnumVariantId(it) => Some(it.into()),
+ ModuleDefId::ConstId(it) => Some(it.into()),
+ ModuleDefId::StaticId(it) => Some(it.into()),
+ ModuleDefId::TraitId(it) => Some(it.into()),
+ ModuleDefId::TypeAliasId(it) => Some(it.into()),
+ ModuleDefId::MacroId(it) => Some(it.into()),
+ ModuleDefId::BuiltinType(_) => None,
+ },
ItemInNs::Macros(id) => Some(id.into()),
}
};
let (is_doc_hidden, is_unstable, do_not_complete) = match attr_id {
None => (false, false, Complete::Yes),
Some(attr_id) => {
- let attrs = db.attrs(attr_id);
+ let attrs = AttrFlags::query(db, attr_id);
let do_not_complete =
- Complete::extract(matches!(attr_id, AttrDefId::TraitId(_)), &attrs);
- (attrs.has_doc_hidden(), attrs.is_unstable(), do_not_complete)
+ Complete::extract(matches!(attr_id, AttrDefId::TraitId(_)), attrs);
+ (
+ attrs.contains(AttrFlags::IS_DOC_HIDDEN),
+ attrs.contains(AttrFlags::IS_UNSTABLE),
+ do_not_complete,
+ )
}
};
@@ -239,15 +253,15 @@ impl ImportMap {
};
let attr_id = item.into();
- let attrs = &db.attrs(attr_id);
+ let attrs = AttrFlags::query(db, attr_id);
let item_do_not_complete = Complete::extract(false, attrs);
let do_not_complete =
Complete::for_trait_item(trait_import_info.complete, item_do_not_complete);
let assoc_item_info = ImportInfo {
container: trait_import_info.container,
name: assoc_item_name.clone(),
- is_doc_hidden: attrs.has_doc_hidden(),
- is_unstable: attrs.is_unstable(),
+ is_doc_hidden: attrs.contains(AttrFlags::IS_DOC_HIDDEN),
+ is_unstable: attrs.contains(AttrFlags::IS_UNSTABLE),
complete: do_not_complete,
};
@@ -622,9 +636,8 @@ mod tests {
assert!(def_map.block_id().is_none(), "block local items should not be in `ImportMap`");
while let Some(parent) = module.containing_module(db) {
- let parent_data = &def_map[parent.local_id];
- let (name, _) =
- parent_data.children.iter().find(|(_, id)| **id == module.local_id).unwrap();
+ let parent_data = &def_map[parent];
+ let (name, _) = parent_data.children.iter().find(|(_, id)| **id == module).unwrap();
segments.push(name);
module = parent;
}