Skip to content

Commit 36a2806

Browse files
committed
Merge the BTreeMap in hir::Crate.
1 parent 0443424 commit 36a2806

File tree

14 files changed

+268
-119
lines changed

14 files changed

+268
-119
lines changed

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,11 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
8282
self.lctx.with_hir_id_owner(item.id, |lctx| match ctxt {
8383
AssocCtxt::Trait => {
8484
let hir_item = lctx.lower_trait_item(item);
85-
let id = hir_item.trait_item_id();
86-
lctx.trait_items.insert(id, hir_item);
87-
lctx.modules.entry(lctx.current_module).or_default().trait_items.insert(id);
85+
lctx.insert_trait_item(hir_item);
8886
}
8987
AssocCtxt::Impl => {
9088
let hir_item = lctx.lower_impl_item(item);
91-
let id = hir_item.impl_item_id();
92-
lctx.impl_items.insert(id, hir_item);
93-
lctx.modules.entry(lctx.current_module).or_default().impl_items.insert(id);
89+
lctx.insert_impl_item(hir_item);
9490
}
9591
});
9692

@@ -101,9 +97,7 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
10197
self.lctx.allocate_hir_id_counter(item.id);
10298
self.lctx.with_hir_id_owner(item.id, |lctx| {
10399
let hir_item = lctx.lower_foreign_item(item);
104-
let id = hir_item.foreign_item_id();
105-
lctx.foreign_items.insert(id, hir_item);
106-
lctx.modules.entry(lctx.current_module).or_default().foreign_items.insert(id);
100+
lctx.insert_foreign_item(hir_item);
107101
});
108102

109103
visit::walk_foreign_item(self, item);
@@ -123,7 +117,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
123117
) -> T {
124118
let old_len = self.in_scope_lifetimes.len();
125119

126-
let parent_generics = match self.items.get(&parent_hir_id).unwrap().kind {
120+
let parent_generics = match self.owners[parent_hir_id.def_id].unwrap().expect_item().kind {
127121
hir::ItemKind::Impl(hir::Impl { ref generics, .. })
128122
| hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params,
129123
_ => &[],
@@ -224,7 +218,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
224218
let hir_id = self.lower_node_id(i.id);
225219
self.lower_attrs(hir_id, &i.attrs);
226220
let body = P(self.lower_mac_args(body));
227-
self.exported_macros.push(hir::MacroDef {
221+
self.insert_macro_def(hir::MacroDef {
228222
ident,
229223
vis,
230224
def_id: hir_id.expect_owner(),

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,8 @@ struct LoweringContext<'a, 'hir: 'a> {
101101
arena: &'hir Arena<'hir>,
102102

103103
/// The items being lowered are collected here.
104-
items: BTreeMap<hir::ItemId, hir::Item<'hir>>,
105-
106-
trait_items: BTreeMap<hir::TraitItemId, hir::TraitItem<'hir>>,
107-
impl_items: BTreeMap<hir::ImplItemId, hir::ImplItem<'hir>>,
108-
foreign_items: BTreeMap<hir::ForeignItemId, hir::ForeignItem<'hir>>,
104+
owners: IndexVec<LocalDefId, Option<hir::OwnerNode<'hir>>>,
109105
bodies: BTreeMap<hir::BodyId, hir::Body<'hir>>,
110-
exported_macros: Vec<hir::MacroDef<'hir>>,
111106
non_exported_macro_attrs: Vec<ast::Attribute>,
112107

113108
trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
@@ -330,15 +325,11 @@ pub fn lower_crate<'a, 'hir>(
330325
resolver,
331326
nt_to_tokenstream,
332327
arena,
333-
items: BTreeMap::new(),
334-
trait_items: BTreeMap::new(),
335-
impl_items: BTreeMap::new(),
336-
foreign_items: BTreeMap::new(),
328+
owners: IndexVec::default(),
337329
bodies: BTreeMap::new(),
338330
trait_impls: BTreeMap::new(),
339331
modules: BTreeMap::new(),
340332
attrs: BTreeMap::default(),
341-
exported_macros: Vec::new(),
342333
non_exported_macro_attrs: Vec::new(),
343334
catch_scopes: Vec::new(),
344335
loop_scopes: Vec::new(),
@@ -558,12 +549,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
558549

559550
let krate = hir::Crate {
560551
item: module,
561-
exported_macros: self.arena.alloc_from_iter(self.exported_macros),
562552
non_exported_macro_attrs: self.arena.alloc_from_iter(self.non_exported_macro_attrs),
563-
items: self.items,
564-
trait_items: self.trait_items,
565-
impl_items: self.impl_items,
566-
foreign_items: self.foreign_items,
553+
owners: self.owners,
567554
bodies: self.bodies,
568555
body_ids,
569556
trait_impls: self.trait_impls,
@@ -576,12 +563,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576563
}
577564

578565
fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId {
579-
let id = hir::ItemId { def_id: item.def_id };
580-
self.items.insert(id, item);
566+
let id = item.item_id();
567+
let item = self.arena.alloc(item);
568+
self.owners.ensure_contains_elem(id.def_id, || None);
569+
self.owners[id.def_id] = Some(hir::OwnerNode::Item(item));
581570
self.modules.entry(self.current_module).or_default().items.insert(id);
582571
id
583572
}
584573

574+
fn insert_foreign_item(&mut self, item: hir::ForeignItem<'hir>) -> hir::ForeignItemId {
575+
let id = item.foreign_item_id();
576+
let item = self.arena.alloc(item);
577+
self.owners.ensure_contains_elem(id.def_id, || None);
578+
self.owners[id.def_id] = Some(hir::OwnerNode::ForeignItem(item));
579+
self.modules.entry(self.current_module).or_default().foreign_items.insert(id);
580+
id
581+
}
582+
583+
fn insert_impl_item(&mut self, item: hir::ImplItem<'hir>) -> hir::ImplItemId {
584+
let id = item.impl_item_id();
585+
let item = self.arena.alloc(item);
586+
self.owners.ensure_contains_elem(id.def_id, || None);
587+
self.owners[id.def_id] = Some(hir::OwnerNode::ImplItem(item));
588+
self.modules.entry(self.current_module).or_default().impl_items.insert(id);
589+
id
590+
}
591+
592+
fn insert_trait_item(&mut self, item: hir::TraitItem<'hir>) -> hir::TraitItemId {
593+
let id = item.trait_item_id();
594+
let item = self.arena.alloc(item);
595+
self.owners.ensure_contains_elem(id.def_id, || None);
596+
self.owners[id.def_id] = Some(hir::OwnerNode::TraitItem(item));
597+
self.modules.entry(self.current_module).or_default().trait_items.insert(id);
598+
id
599+
}
600+
601+
fn insert_macro_def(&mut self, item: hir::MacroDef<'hir>) {
602+
let def_id = item.def_id;
603+
let item = self.arena.alloc(item);
604+
self.owners.ensure_contains_elem(def_id, || None);
605+
self.owners[def_id] = Some(hir::OwnerNode::MacroDef(item));
606+
}
607+
585608
fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId {
586609
// Set up the counter if needed.
587610
self.item_local_id_counters.entry(owner).or_insert(0);

compiler/rustc_hir/src/arena.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ macro_rules! arena_types {
2929
[] fn_decl: rustc_hir::FnDecl<$tcx>,
3030
[] foreign_item: rustc_hir::ForeignItem<$tcx>,
3131
[few] foreign_item_ref: rustc_hir::ForeignItemRef<$tcx>,
32+
[] impl_item: rustc_hir::ImplItem<$tcx>,
3233
[] impl_item_ref: rustc_hir::ImplItemRef<$tcx>,
34+
[] item: rustc_hir::Item<$tcx>,
3335
[few] inline_asm: rustc_hir::InlineAsm<$tcx>,
3436
[few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>,
3537
[] local: rustc_hir::Local<$tcx>,
@@ -42,6 +44,7 @@ macro_rules! arena_types {
4244
[] qpath: rustc_hir::QPath<$tcx>,
4345
[] stmt: rustc_hir::Stmt<$tcx>,
4446
[] field_def: rustc_hir::FieldDef<$tcx>,
47+
[] trait_item: rustc_hir::TraitItem<$tcx>,
4548
[] trait_item_ref: rustc_hir::TraitItemRef,
4649
[] ty: rustc_hir::Ty<$tcx>,
4750
[] type_binding: rustc_hir::TypeBinding<$tcx>,

0 commit comments

Comments
 (0)