Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/item_scope.rs')
-rw-r--r--crates/hir-def/src/item_scope.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/crates/hir-def/src/item_scope.rs b/crates/hir-def/src/item_scope.rs
index 65a39c5656..0ca1eb9bcf 100644
--- a/crates/hir-def/src/item_scope.rs
+++ b/crates/hir-def/src/item_scope.rs
@@ -18,8 +18,8 @@ use crate::{
db::DefDatabase,
per_ns::{Item, MacrosItem, PerNs, TypesItem, ValuesItem},
visibility::{Visibility, VisibilityExplicitness},
- AdtId, BuiltinType, ConstId, ExternCrateId, FxIndexMap, HasModule, ImplId, LocalModuleId,
- Lookup, MacroId, ModuleDefId, ModuleId, TraitId, UseId,
+ AdtId, BuiltinType, ConstId, ExternBlockId, ExternCrateId, FxIndexMap, HasModule, ImplId,
+ LocalModuleId, Lookup, MacroId, ModuleDefId, ModuleId, TraitId, UseId,
};
#[derive(Debug, Default)]
@@ -158,6 +158,8 @@ pub struct ItemScope {
declarations: Vec<ModuleDefId>,
impls: Vec<ImplId>,
+ #[allow(clippy::box_collection)]
+ extern_blocks: Option<Box<Vec<ExternBlockId>>>,
unnamed_consts: Vec<ConstId>,
/// Traits imported via `use Trait as _;`.
unnamed_trait_imports: FxHashMap<TraitId, Item<()>>,
@@ -319,6 +321,10 @@ impl ItemScope {
self.extern_crate_decls.iter().copied()
}
+ pub fn extern_blocks(&self) -> impl Iterator<Item = ExternBlockId> + '_ {
+ self.extern_blocks.iter().flat_map(|it| it.iter()).copied()
+ }
+
pub fn use_decls(&self) -> impl ExactSizeIterator<Item = UseId> + '_ {
self.use_decls.iter().copied()
}
@@ -469,6 +475,10 @@ impl ItemScope {
self.impls.push(imp);
}
+ pub(crate) fn define_extern_block(&mut self, extern_block: ExternBlockId) {
+ self.extern_blocks.get_or_insert_default().push(extern_block);
+ }
+
pub(crate) fn define_extern_crate_decl(&mut self, extern_crate: ExternCrateId) {
self.extern_crate_decls.push(extern_crate);
}
@@ -806,7 +816,11 @@ impl ItemScope {
use_imports_types,
use_imports_macros,
macro_invocations,
+ extern_blocks,
} = self;
+ if let Some(it) = extern_blocks {
+ it.shrink_to_fit();
+ }
types.shrink_to_fit();
values.shrink_to_fit();
macros.shrink_to_fit();