hir: Simplify hir_owner_nodes
query
The query accept arbitrary DefIds, not just owner DefIds. The return can be an `Option` because if there are no nodes, then it doesn't matter whether it's due to NonOwner or Phantom. Also rename the query to `opt_hir_owner_nodes`.
This commit is contained in:
parent
c401f09979
commit
64b6b5b6ce
40 changed files with 862 additions and 867 deletions
|
@ -135,12 +135,12 @@ impl<'hir> Iterator for ParentOwnerIterator<'hir> {
|
|||
impl<'tcx> TyCtxt<'tcx> {
|
||||
#[inline]
|
||||
fn hir_owner(self, owner: OwnerId) -> Option<OwnerNode<'tcx>> {
|
||||
Some(self.hir_owner_nodes(owner).as_owner()?.node())
|
||||
Some(self.opt_hir_owner_nodes(owner.def_id)?.node())
|
||||
}
|
||||
|
||||
/// Retrieves the `hir::Node` corresponding to `id`, returning `None` if cannot be found.
|
||||
pub fn opt_hir_node(self, id: HirId) -> Option<Node<'tcx>> {
|
||||
let owner = self.hir_owner_nodes(id.owner).as_owner()?;
|
||||
let owner = self.opt_hir_owner_nodes(id.owner)?;
|
||||
let node = owner.nodes[id.local_id].as_ref()?;
|
||||
Some(node.node)
|
||||
}
|
||||
|
@ -213,7 +213,7 @@ impl<'hir> Map<'hir> {
|
|||
if id.local_id == ItemLocalId::from_u32(0) {
|
||||
Some(self.tcx.hir_owner_parent(id.owner))
|
||||
} else {
|
||||
let owner = self.tcx.hir_owner_nodes(id.owner).as_owner()?;
|
||||
let owner = self.tcx.opt_hir_owner_nodes(id.owner)?;
|
||||
let node = owner.nodes[id.local_id].as_ref()?;
|
||||
let hir_id = HirId { owner: id.owner, local_id: node.parent };
|
||||
// HIR indexing should have checked that.
|
||||
|
@ -266,7 +266,7 @@ impl<'hir> Map<'hir> {
|
|||
}
|
||||
|
||||
pub fn body(self, id: BodyId) -> &'hir Body<'hir> {
|
||||
self.tcx.hir_owner_nodes(id.hir_id.owner).unwrap().bodies[&id.hir_id.local_id]
|
||||
self.tcx.opt_hir_owner_nodes(id.hir_id.owner).unwrap().bodies[&id.hir_id.local_id]
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
|
|
|
@ -135,13 +135,8 @@ pub fn provide(providers: &mut Providers) {
|
|||
MaybeOwner::NonOwner(hir_id) => hir_id,
|
||||
})
|
||||
};
|
||||
providers.hir_owner_nodes = |tcx, id| {
|
||||
if let Some(i) = tcx.hir_crate(()).owners.get(id.def_id) {
|
||||
i.map(|i| &i.nodes)
|
||||
} else {
|
||||
MaybeOwner::Phantom
|
||||
}
|
||||
};
|
||||
providers.opt_hir_owner_nodes =
|
||||
|tcx, id| tcx.hir_crate(()).owners.get(id)?.as_owner().map(|i| &i.nodes);
|
||||
providers.hir_owner_parent = |tcx, id| {
|
||||
// Accessing the local_parent is ok since its value is hashed as part of `id`'s DefPathHash.
|
||||
tcx.opt_local_parent(id.def_id).map_or(CRATE_HIR_ID, |parent| {
|
||||
|
|
|
@ -190,11 +190,11 @@ rustc_queries! {
|
|||
desc { |tcx| "getting HIR parent of `{}`", tcx.def_path_str(key) }
|
||||
}
|
||||
|
||||
/// Gives access to the HIR nodes and bodies inside the HIR owner `key`.
|
||||
/// Gives access to the HIR nodes and bodies inside `key` if it's a HIR owner.
|
||||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_owner_nodes(key: hir::OwnerId) -> hir::MaybeOwner<&'tcx hir::OwnerNodes<'tcx>> {
|
||||
query opt_hir_owner_nodes(key: LocalDefId) -> Option<&'tcx hir::OwnerNodes<'tcx>> {
|
||||
desc { |tcx| "getting HIR owner items in `{}`", tcx.def_path_str(key) }
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue