Store hir_id_to_def_id in OwnerInfo.
This commit is contained in:
parent
17dfae79bb
commit
80132c3ce4
5 changed files with 31 additions and 19 deletions
|
@ -479,6 +479,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
let attrs = std::mem::take(&mut self.attrs);
|
let attrs = std::mem::take(&mut self.attrs);
|
||||||
let mut bodies = std::mem::take(&mut self.bodies);
|
let mut bodies = std::mem::take(&mut self.bodies);
|
||||||
let local_node_ids = std::mem::take(&mut self.local_node_ids);
|
let local_node_ids = std::mem::take(&mut self.local_node_ids);
|
||||||
|
|
||||||
|
let local_id_to_def_id = local_node_ids
|
||||||
|
.iter()
|
||||||
|
.filter_map(|&node_id| {
|
||||||
|
let def_id = self.resolver.opt_local_def_id(node_id)?;
|
||||||
|
let hir_id = self.node_id_to_hir_id[node_id]?;
|
||||||
|
Some((hir_id.local_id, def_id))
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let trait_map = local_node_ids
|
let trait_map = local_node_ids
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|node_id| {
|
.filter_map(|node_id| {
|
||||||
|
@ -501,7 +511,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
let (hash_including_bodies, hash_without_bodies) = self.hash_owner(node, &bodies);
|
let (hash_including_bodies, hash_without_bodies) = self.hash_owner(node, &bodies);
|
||||||
let (nodes, parenting) =
|
let (nodes, parenting) =
|
||||||
index::index_hir(self.sess, self.resolver.definitions(), node, &bodies);
|
index::index_hir(self.sess, self.resolver.definitions(), node, &bodies);
|
||||||
let nodes = hir::OwnerNodes { hash_including_bodies, hash_without_bodies, nodes, bodies };
|
let nodes = hir::OwnerNodes {
|
||||||
|
hash_including_bodies,
|
||||||
|
hash_without_bodies,
|
||||||
|
nodes,
|
||||||
|
bodies,
|
||||||
|
local_id_to_def_id,
|
||||||
|
};
|
||||||
let attrs = {
|
let attrs = {
|
||||||
let mut hcx = self.resolver.create_stable_hashing_context();
|
let mut hcx = self.resolver.create_stable_hashing_context();
|
||||||
let mut stable_hasher = StableHasher::new();
|
let mut stable_hasher = StableHasher::new();
|
||||||
|
|
|
@ -107,8 +107,6 @@ pub struct Definitions {
|
||||||
/// Their `HirId`s are defined by their position while lowering the enclosing owner.
|
/// Their `HirId`s are defined by their position while lowering the enclosing owner.
|
||||||
// FIXME(cjgillot) Some `LocalDefId`s from `use` items are dropped during lowering and lack a `HirId`.
|
// FIXME(cjgillot) Some `LocalDefId`s from `use` items are dropped during lowering and lack a `HirId`.
|
||||||
pub(super) def_id_to_hir_id: IndexVec<LocalDefId, Option<hir::HirId>>,
|
pub(super) def_id_to_hir_id: IndexVec<LocalDefId, Option<hir::HirId>>,
|
||||||
/// The reverse mapping of `def_id_to_hir_id`.
|
|
||||||
pub(super) hir_id_to_def_id: FxHashMap<hir::HirId, LocalDefId>,
|
|
||||||
|
|
||||||
/// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
|
/// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
|
||||||
expansions_that_defined: FxHashMap<LocalDefId, ExpnId>,
|
expansions_that_defined: FxHashMap<LocalDefId, ExpnId>,
|
||||||
|
@ -330,11 +328,6 @@ impl Definitions {
|
||||||
self.def_id_to_hir_id[id].unwrap()
|
self.def_id_to_hir_id[id].unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn opt_hir_id_to_local_def_id(&self, hir_id: hir::HirId) -> Option<LocalDefId> {
|
|
||||||
self.hir_id_to_def_id.get(&hir_id).copied()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Adds a root definition (no parent) and a few other reserved definitions.
|
/// Adds a root definition (no parent) and a few other reserved definitions.
|
||||||
pub fn new(stable_crate_id: StableCrateId, crate_span: Span) -> Definitions {
|
pub fn new(stable_crate_id: StableCrateId, crate_span: Span) -> Definitions {
|
||||||
let key = DefKey {
|
let key = DefKey {
|
||||||
|
@ -362,7 +355,6 @@ impl Definitions {
|
||||||
Definitions {
|
Definitions {
|
||||||
table,
|
table,
|
||||||
def_id_to_hir_id: Default::default(),
|
def_id_to_hir_id: Default::default(),
|
||||||
hir_id_to_def_id: Default::default(),
|
|
||||||
expansions_that_defined: Default::default(),
|
expansions_that_defined: Default::default(),
|
||||||
def_id_to_span,
|
def_id_to_span,
|
||||||
stable_crate_id,
|
stable_crate_id,
|
||||||
|
@ -425,12 +417,6 @@ impl Definitions {
|
||||||
"trying to initialize `LocalDefId` <-> `HirId` mappings twice"
|
"trying to initialize `LocalDefId` <-> `HirId` mappings twice"
|
||||||
);
|
);
|
||||||
|
|
||||||
// Build the reverse mapping of `def_id_to_hir_id`.
|
|
||||||
self.hir_id_to_def_id = mapping
|
|
||||||
.iter_enumerated()
|
|
||||||
.filter_map(|(def_id, hir_id)| hir_id.map(|hir_id| (hir_id, def_id)))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
self.def_id_to_hir_id = mapping;
|
self.def_id_to_hir_id = mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -707,6 +707,8 @@ pub struct OwnerNodes<'tcx> {
|
||||||
pub nodes: IndexVec<ItemLocalId, Option<ParentedNode<'tcx>>>,
|
pub nodes: IndexVec<ItemLocalId, Option<ParentedNode<'tcx>>>,
|
||||||
/// Content of local bodies.
|
/// Content of local bodies.
|
||||||
pub bodies: SortedMap<ItemLocalId, &'tcx Body<'tcx>>,
|
pub bodies: SortedMap<ItemLocalId, &'tcx Body<'tcx>>,
|
||||||
|
/// Non-owning definitions contained in this owner.
|
||||||
|
pub local_id_to_def_id: SortedMap<ItemLocalId, LocalDefId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Full information resulting from lowering an AST node.
|
/// Full information resulting from lowering an AST node.
|
||||||
|
|
|
@ -208,8 +208,13 @@ impl<'tcx, HirCtx: crate::HashStableContext> HashStable<HirCtx> for OwnerNodes<'
|
||||||
fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
|
fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
|
||||||
// We ignore the `nodes` and `bodies` fields since these refer to information included in
|
// We ignore the `nodes` and `bodies` fields since these refer to information included in
|
||||||
// `hash` which is hashed in the collector and used for the crate hash.
|
// `hash` which is hashed in the collector and used for the crate hash.
|
||||||
let OwnerNodes { hash_including_bodies, hash_without_bodies: _, nodes: _, bodies: _ } =
|
let OwnerNodes {
|
||||||
*self;
|
hash_including_bodies,
|
||||||
|
hash_without_bodies: _,
|
||||||
|
nodes: _,
|
||||||
|
bodies: _,
|
||||||
|
local_id_to_def_id: _,
|
||||||
|
} = *self;
|
||||||
hash_including_bodies.hash_stable(hcx, hasher);
|
hash_including_bodies.hash_stable(hcx, hasher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,8 +204,11 @@ impl<'hir> Map<'hir> {
|
||||||
if hir_id.local_id == ItemLocalId::new(0) {
|
if hir_id.local_id == ItemLocalId::new(0) {
|
||||||
Some(hir_id.owner)
|
Some(hir_id.owner)
|
||||||
} else {
|
} else {
|
||||||
// FIXME(#85914) is this access safe for incr. comp.?
|
self.tcx
|
||||||
self.tcx.untracked_resolutions.definitions.opt_hir_id_to_local_def_id(hir_id)
|
.hir_owner_nodes(hir_id.owner)?
|
||||||
|
.local_id_to_def_id
|
||||||
|
.get(&hir_id.local_id)
|
||||||
|
.copied()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue