Store def_id_to_hir_id as variant in hir_owner.
If hir_owner is Owner(_), the LocalDefId is pointing to an owner, so the ItemLocalId is 0. If the HIR node does not exist, we store Phantom. Otherwise, we store the HirId associated to the LocalDefId.
This commit is contained in:
parent
009c1d0248
commit
a0bcce4884
11 changed files with 123 additions and 112 deletions
|
@ -105,12 +105,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
) -> T {
|
||||
let old_len = self.in_scope_lifetimes.len();
|
||||
|
||||
let parent_generics =
|
||||
match self.owners[parent_hir_id].as_ref().unwrap().node().expect_item().kind {
|
||||
hir::ItemKind::Impl(hir::Impl { ref generics, .. })
|
||||
| hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params,
|
||||
_ => &[],
|
||||
};
|
||||
let parent_generics = match self.owners[parent_hir_id].unwrap().node().expect_item().kind {
|
||||
hir::ItemKind::Impl(hir::Impl { ref generics, .. })
|
||||
| hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params,
|
||||
_ => &[],
|
||||
};
|
||||
let lt_def_names = parent_generics.iter().filter_map(|param| match param.kind {
|
||||
hir::GenericParamKind::Lifetime { .. } => Some(param.name.normalize_to_macros_2_0()),
|
||||
_ => None,
|
||||
|
@ -480,6 +479,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
.node_id_to_hir_id
|
||||
.insert(new_node_id, hir::HirId::make_owner(new_id));
|
||||
debug_assert!(_old.is_none());
|
||||
self.owners.ensure_contains_elem(new_id, || hir::MaybeOwner::Phantom);
|
||||
let _old = std::mem::replace(
|
||||
&mut self.owners[new_id],
|
||||
hir::MaybeOwner::NonOwner(hir::HirId::make_owner(new_id)),
|
||||
);
|
||||
debug_assert!(matches!(_old, hir::MaybeOwner::Phantom));
|
||||
continue;
|
||||
};
|
||||
let ident = *ident;
|
||||
|
|
|
@ -98,7 +98,7 @@ struct LoweringContext<'a, 'hir: 'a> {
|
|||
arena: &'hir Arena<'hir>,
|
||||
|
||||
/// The items being lowered are collected here.
|
||||
owners: IndexVec<LocalDefId, Option<hir::OwnerInfo<'hir>>>,
|
||||
owners: IndexVec<LocalDefId, hir::MaybeOwner<&'hir hir::OwnerInfo<'hir>>>,
|
||||
/// Bodies inside the owner being lowered.
|
||||
bodies: Vec<(hir::ItemLocalId, &'hir hir::Body<'hir>)>,
|
||||
/// Attributes inside the owner being lowered.
|
||||
|
@ -291,7 +291,8 @@ pub fn lower_crate<'a, 'hir>(
|
|||
) -> &'hir hir::Crate<'hir> {
|
||||
let _prof_timer = sess.prof.verbose_generic_activity("hir_lowering");
|
||||
|
||||
let owners = IndexVec::from_fn_n(|_| None, resolver.definitions().def_index_count());
|
||||
let owners =
|
||||
IndexVec::from_fn_n(|_| hir::MaybeOwner::Phantom, resolver.definitions().def_index_count());
|
||||
LoweringContext {
|
||||
sess,
|
||||
resolver,
|
||||
|
@ -402,19 +403,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
|
||||
let hir_hash = self.compute_hir_hash();
|
||||
|
||||
let mut def_id_to_hir_id = IndexVec::default();
|
||||
|
||||
for (node_id, hir_id) in self.node_id_to_hir_id.into_iter_enumerated() {
|
||||
if let Some(def_id) = self.resolver.opt_local_def_id(node_id) {
|
||||
if def_id_to_hir_id.len() <= def_id.index() {
|
||||
def_id_to_hir_id.resize(def_id.index() + 1, None);
|
||||
}
|
||||
def_id_to_hir_id[def_id] = hir_id;
|
||||
}
|
||||
}
|
||||
|
||||
self.resolver.definitions().init_def_id_to_hir_id_mapping(def_id_to_hir_id);
|
||||
|
||||
let krate = hir::Crate { owners: self.owners, hir_hash };
|
||||
self.arena.alloc(krate)
|
||||
}
|
||||
|
@ -427,7 +415,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
.owners
|
||||
.iter_enumerated()
|
||||
.filter_map(|(def_id, info)| {
|
||||
let info = info.as_ref()?;
|
||||
let info = info.as_owner()?;
|
||||
let def_path_hash = definitions.def_path_hash(def_id);
|
||||
Some((def_path_hash, info))
|
||||
})
|
||||
|
@ -469,8 +457,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
self.current_hir_id_owner = current_owner;
|
||||
self.item_local_id_counter = current_local_counter;
|
||||
|
||||
let _old = self.owners.insert(def_id, info);
|
||||
debug_assert!(_old.is_none());
|
||||
self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom);
|
||||
self.owners[def_id] = hir::MaybeOwner::Owner(self.arena.alloc(info));
|
||||
|
||||
def_id
|
||||
}
|
||||
|
@ -488,6 +476,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
None
|
||||
} else {
|
||||
let def_id = self.resolver.opt_local_def_id(node_id)?;
|
||||
self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom);
|
||||
if let o @ hir::MaybeOwner::Phantom = &mut self.owners[def_id] {
|
||||
// Do not override a `MaybeOwner::Owner` that may already here.
|
||||
*o = hir::MaybeOwner::NonOwner(hir_id);
|
||||
}
|
||||
Some((hir_id.local_id, def_id))
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue