Auto merge of #102040 - TaKO8Ki:separate-definitions-and-hir-owners, r=cjgillot
Separate definitions and HIR owners in the type system Fixes #83158 r? `@cjgillot`
This commit is contained in:
commit
d0ece44cfa
114 changed files with 659 additions and 518 deletions
|
@ -62,7 +62,7 @@ use crate::ty::TyCtxt;
|
|||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
|
||||
use rustc_hir::definitions::DefPathHash;
|
||||
use rustc_hir::HirId;
|
||||
use rustc_hir::{HirId, OwnerId};
|
||||
use rustc_query_system::dep_graph::FingerprintStyle;
|
||||
use rustc_span::symbol::Symbol;
|
||||
use std::hash::Hash;
|
||||
|
@ -355,6 +355,28 @@ impl<'tcx> DepNodeParams<TyCtxt<'tcx>> for LocalDefId {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'tcx> DepNodeParams<TyCtxt<'tcx>> for OwnerId {
|
||||
#[inline(always)]
|
||||
fn fingerprint_style() -> FingerprintStyle {
|
||||
FingerprintStyle::DefPathHash
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn to_fingerprint(&self, tcx: TyCtxt<'tcx>) -> Fingerprint {
|
||||
self.to_def_id().to_fingerprint(tcx)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn to_debug_str(&self, tcx: TyCtxt<'tcx>) -> String {
|
||||
self.to_def_id().to_debug_str(tcx)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn recover(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option<Self> {
|
||||
dep_node.extract_def_id(tcx).map(|id| OwnerId { def_id: id.expect_local() })
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> DepNodeParams<TyCtxt<'tcx>> for CrateNum {
|
||||
#[inline(always)]
|
||||
fn fingerprint_style() -> FingerprintStyle {
|
||||
|
|
|
@ -93,7 +93,7 @@ pub struct ParentOwnerIterator<'hir> {
|
|||
}
|
||||
|
||||
impl<'hir> Iterator for ParentOwnerIterator<'hir> {
|
||||
type Item = (LocalDefId, OwnerNode<'hir>);
|
||||
type Item = (OwnerId, OwnerNode<'hir>);
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if self.current_id.local_id.index() != 0 {
|
||||
|
@ -107,13 +107,13 @@ impl<'hir> Iterator for ParentOwnerIterator<'hir> {
|
|||
}
|
||||
loop {
|
||||
// There are nodes that do not have entries, so we need to skip them.
|
||||
let parent_id = self.map.def_key(self.current_id.owner).parent;
|
||||
let parent_id = self.map.def_key(self.current_id.owner.def_id).parent;
|
||||
|
||||
let parent_id = parent_id.map_or(CRATE_HIR_ID.owner, |local_def_index| {
|
||||
let parent_id = parent_id.map_or(CRATE_OWNER_ID, |local_def_index| {
|
||||
let def_id = LocalDefId { local_def_index };
|
||||
self.map.local_def_id_to_hir_id(def_id).owner
|
||||
});
|
||||
self.current_id = HirId::make_owner(parent_id);
|
||||
self.current_id = HirId::make_owner(parent_id.def_id);
|
||||
|
||||
// If this `HirId` doesn't have an entry, skip it and look for its `parent_id`.
|
||||
if let Some(node) = self.map.tcx.hir_owner(self.current_id.owner) {
|
||||
|
@ -131,7 +131,7 @@ impl<'hir> Map<'hir> {
|
|||
|
||||
#[inline]
|
||||
pub fn root_module(self) -> &'hir Mod<'hir> {
|
||||
match self.tcx.hir_owner(CRATE_DEF_ID).map(|o| o.node) {
|
||||
match self.tcx.hir_owner(CRATE_OWNER_ID).map(|o| o.node) {
|
||||
Some(OwnerNode::Crate(item)) => item,
|
||||
_ => bug!(),
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ impl<'hir> Map<'hir> {
|
|||
#[inline]
|
||||
pub fn opt_local_def_id(self, hir_id: HirId) -> Option<LocalDefId> {
|
||||
if hir_id.local_id == ItemLocalId::new(0) {
|
||||
Some(hir_id.owner)
|
||||
Some(hir_id.owner.def_id)
|
||||
} else {
|
||||
self.tcx
|
||||
.hir_owner_nodes(hir_id.owner)
|
||||
|
@ -352,7 +352,7 @@ impl<'hir> Map<'hir> {
|
|||
}
|
||||
|
||||
pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> {
|
||||
let node = self.tcx.hir_owner(id)?;
|
||||
let node = self.tcx.hir_owner(OwnerId { def_id: id })?;
|
||||
node.node.generics()
|
||||
}
|
||||
|
||||
|
@ -532,7 +532,7 @@ impl<'hir> Map<'hir> {
|
|||
|
||||
pub fn get_module(self, module: LocalDefId) -> (&'hir Mod<'hir>, Span, HirId) {
|
||||
let hir_id = HirId::make_owner(module);
|
||||
match self.tcx.hir_owner(module).map(|o| o.node) {
|
||||
match self.tcx.hir_owner(hir_id.owner).map(|o| o.node) {
|
||||
Some(OwnerNode::Item(&Item { span, kind: ItemKind::Mod(ref m), .. })) => {
|
||||
(m, span, hir_id)
|
||||
}
|
||||
|
@ -622,14 +622,14 @@ impl<'hir> Map<'hir> {
|
|||
pub fn for_each_module(self, mut f: impl FnMut(LocalDefId)) {
|
||||
let crate_items = self.tcx.hir_crate_items(());
|
||||
for module in crate_items.submodules.iter() {
|
||||
f(*module)
|
||||
f(module.def_id)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn par_for_each_module(self, f: impl Fn(LocalDefId) + Sync + Send) {
|
||||
let crate_items = self.tcx.hir_crate_items(());
|
||||
par_for_each_in(&crate_items.submodules[..], |module| f(*module))
|
||||
par_for_each_in(&crate_items.submodules[..], |module| f(module.def_id))
|
||||
}
|
||||
|
||||
/// Returns an iterator for the nodes in the ancestor tree of the `current_id`
|
||||
|
@ -721,27 +721,27 @@ impl<'hir> Map<'hir> {
|
|||
None
|
||||
}
|
||||
|
||||
/// Retrieves the `HirId` for `id`'s parent item, or `id` itself if no
|
||||
/// Retrieves the `OwnerId` for `id`'s parent item, or `id` itself if no
|
||||
/// parent item is in this map. The "parent item" is the closest parent node
|
||||
/// in the HIR which is recorded by the map and is an item, either an item
|
||||
/// in a module, trait, or impl.
|
||||
pub fn get_parent_item(self, hir_id: HirId) -> LocalDefId {
|
||||
pub fn get_parent_item(self, hir_id: HirId) -> OwnerId {
|
||||
if let Some((def_id, _node)) = self.parent_owner_iter(hir_id).next() {
|
||||
def_id
|
||||
} else {
|
||||
CRATE_DEF_ID
|
||||
CRATE_OWNER_ID
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the `HirId` of `id`'s nearest module parent, or `id` itself if no
|
||||
/// Returns the `OwnerId` of `id`'s nearest module parent, or `id` itself if no
|
||||
/// module parent is in this map.
|
||||
pub(super) fn get_module_parent_node(self, hir_id: HirId) -> LocalDefId {
|
||||
pub(super) fn get_module_parent_node(self, hir_id: HirId) -> OwnerId {
|
||||
for (def_id, node) in self.parent_owner_iter(hir_id) {
|
||||
if let OwnerNode::Item(&Item { kind: ItemKind::Mod(_), .. }) = node {
|
||||
return def_id;
|
||||
}
|
||||
}
|
||||
CRATE_DEF_ID
|
||||
CRATE_OWNER_ID
|
||||
}
|
||||
|
||||
/// When on an if expression, a match arm tail expression or a match arm, give back
|
||||
|
@ -814,30 +814,30 @@ impl<'hir> Map<'hir> {
|
|||
}
|
||||
bug!(
|
||||
"expected foreign mod or inlined parent, found {}",
|
||||
self.node_to_string(HirId::make_owner(parent))
|
||||
self.node_to_string(HirId::make_owner(parent.def_id))
|
||||
)
|
||||
}
|
||||
|
||||
pub fn expect_owner(self, id: LocalDefId) -> OwnerNode<'hir> {
|
||||
pub fn expect_owner(self, id: OwnerId) -> OwnerNode<'hir> {
|
||||
self.tcx.hir_owner(id).unwrap_or_else(|| bug!("expected owner for {:?}", id)).node
|
||||
}
|
||||
|
||||
pub fn expect_item(self, id: LocalDefId) -> &'hir Item<'hir> {
|
||||
match self.tcx.hir_owner(id) {
|
||||
match self.tcx.hir_owner(OwnerId { def_id: id }) {
|
||||
Some(Owner { node: OwnerNode::Item(item), .. }) => item,
|
||||
_ => bug!("expected item, found {}", self.node_to_string(HirId::make_owner(id))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn expect_impl_item(self, id: LocalDefId) -> &'hir ImplItem<'hir> {
|
||||
match self.tcx.hir_owner(id) {
|
||||
match self.tcx.hir_owner(OwnerId { def_id: id }) {
|
||||
Some(Owner { node: OwnerNode::ImplItem(item), .. }) => item,
|
||||
_ => bug!("expected impl item, found {}", self.node_to_string(HirId::make_owner(id))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn expect_trait_item(self, id: LocalDefId) -> &'hir TraitItem<'hir> {
|
||||
match self.tcx.hir_owner(id) {
|
||||
match self.tcx.hir_owner(OwnerId { def_id: id }) {
|
||||
Some(Owner { node: OwnerNode::TraitItem(item), .. }) => item,
|
||||
_ => bug!("expected trait item, found {}", self.node_to_string(HirId::make_owner(id))),
|
||||
}
|
||||
|
@ -850,11 +850,14 @@ impl<'hir> Map<'hir> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn expect_foreign_item(self, id: LocalDefId) -> &'hir ForeignItem<'hir> {
|
||||
pub fn expect_foreign_item(self, id: OwnerId) -> &'hir ForeignItem<'hir> {
|
||||
match self.tcx.hir_owner(id) {
|
||||
Some(Owner { node: OwnerNode::ForeignItem(item), .. }) => item,
|
||||
_ => {
|
||||
bug!("expected foreign item, found {}", self.node_to_string(HirId::make_owner(id)))
|
||||
bug!(
|
||||
"expected foreign item, found {}",
|
||||
self.node_to_string(HirId::make_owner(id.def_id))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1290,7 +1293,7 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
|
|||
// A "crate collector" and "module collector" start at a
|
||||
// module item (the former starts at the crate root) but only
|
||||
// the former needs to collect it. ItemCollector does not do this for us.
|
||||
collector.submodules.push(CRATE_DEF_ID);
|
||||
collector.submodules.push(CRATE_OWNER_ID);
|
||||
tcx.hir().walk_toplevel_module(&mut collector);
|
||||
|
||||
let ItemCollector {
|
||||
|
@ -1318,7 +1321,7 @@ struct ItemCollector<'tcx> {
|
|||
// otherwise it collects items in some module.
|
||||
crate_collector: bool,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
submodules: Vec<LocalDefId>,
|
||||
submodules: Vec<OwnerId>,
|
||||
items: Vec<ItemId>,
|
||||
trait_items: Vec<TraitItemId>,
|
||||
impl_items: Vec<ImplItemId>,
|
||||
|
@ -1350,7 +1353,7 @@ impl<'hir> Visitor<'hir> for ItemCollector<'hir> {
|
|||
|
||||
fn visit_item(&mut self, item: &'hir Item<'hir>) {
|
||||
if associated_body(Node::Item(item)).is_some() {
|
||||
self.body_owners.push(item.def_id);
|
||||
self.body_owners.push(item.def_id.def_id);
|
||||
}
|
||||
|
||||
self.items.push(item.item_id());
|
||||
|
@ -1386,7 +1389,7 @@ impl<'hir> Visitor<'hir> for ItemCollector<'hir> {
|
|||
|
||||
fn visit_trait_item(&mut self, item: &'hir TraitItem<'hir>) {
|
||||
if associated_body(Node::TraitItem(item)).is_some() {
|
||||
self.body_owners.push(item.def_id);
|
||||
self.body_owners.push(item.def_id.def_id);
|
||||
}
|
||||
|
||||
self.trait_items.push(item.trait_item_id());
|
||||
|
@ -1395,7 +1398,7 @@ impl<'hir> Visitor<'hir> for ItemCollector<'hir> {
|
|||
|
||||
fn visit_impl_item(&mut self, item: &'hir ImplItem<'hir>) {
|
||||
if associated_body(Node::ImplItem(item)).is_some() {
|
||||
self.body_owners.push(item.def_id);
|
||||
self.body_owners.push(item.def_id.def_id);
|
||||
}
|
||||
|
||||
self.impl_items.push(item.impl_item_id());
|
||||
|
|
|
@ -39,7 +39,7 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Owner<'tcx> {
|
|||
/// bodies. The Ids are in visitor order. This is used to partition a pass between modules.
|
||||
#[derive(Debug, HashStable, Encodable, Decodable)]
|
||||
pub struct ModuleItems {
|
||||
submodules: Box<[LocalDefId]>,
|
||||
submodules: Box<[OwnerId]>,
|
||||
items: Box<[ItemId]>,
|
||||
trait_items: Box<[TraitItemId]>,
|
||||
impl_items: Box<[ImplItemId]>,
|
||||
|
@ -67,10 +67,10 @@ impl ModuleItems {
|
|||
pub fn definitions(&self) -> impl Iterator<Item = LocalDefId> + '_ {
|
||||
self.items
|
||||
.iter()
|
||||
.map(|id| id.def_id)
|
||||
.chain(self.trait_items.iter().map(|id| id.def_id))
|
||||
.chain(self.impl_items.iter().map(|id| id.def_id))
|
||||
.chain(self.foreign_items.iter().map(|id| id.def_id))
|
||||
.map(|id| id.def_id.def_id)
|
||||
.chain(self.trait_items.iter().map(|id| id.def_id.def_id))
|
||||
.chain(self.impl_items.iter().map(|id| id.def_id.def_id))
|
||||
.chain(self.foreign_items.iter().map(|id| id.def_id.def_id))
|
||||
}
|
||||
|
||||
pub fn par_items(&self, f: impl Fn(ItemId) + Send + Sync) {
|
||||
|
@ -97,7 +97,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
}
|
||||
|
||||
pub fn parent_module(self, id: HirId) -> LocalDefId {
|
||||
self.parent_module_from_def_id(id.owner)
|
||||
self.parent_module_from_def_id(id.owner.def_id)
|
||||
}
|
||||
|
||||
pub fn impl_subject(self, def_id: DefId) -> ImplSubject<'tcx> {
|
||||
|
@ -110,13 +110,13 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
pub fn provide(providers: &mut Providers) {
|
||||
providers.parent_module_from_def_id = |tcx, id| {
|
||||
let hir = tcx.hir();
|
||||
hir.get_module_parent_node(hir.local_def_id_to_hir_id(id))
|
||||
hir.get_module_parent_node(hir.local_def_id_to_hir_id(id)).def_id
|
||||
};
|
||||
providers.hir_crate_items = map::hir_crate_items;
|
||||
providers.crate_hash = map::crate_hash;
|
||||
providers.hir_module_items = map::hir_module_items;
|
||||
providers.hir_owner = |tcx, id| {
|
||||
let owner = tcx.hir_crate(()).owners.get(id)?.as_owner()?;
|
||||
let owner = tcx.hir_crate(()).owners.get(id.def_id)?.as_owner()?;
|
||||
let node = owner.node();
|
||||
Some(Owner { node, hash_without_bodies: owner.nodes.hash_without_bodies })
|
||||
};
|
||||
|
@ -128,21 +128,24 @@ pub fn provide(providers: &mut Providers) {
|
|||
MaybeOwner::NonOwner(hir_id) => hir_id,
|
||||
}
|
||||
};
|
||||
providers.hir_owner_nodes = |tcx, id| tcx.hir_crate(()).owners[id].map(|i| &i.nodes);
|
||||
providers.hir_owner_nodes = |tcx, id| tcx.hir_crate(()).owners[id.def_id].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).map_or(CRATE_HIR_ID, |parent| {
|
||||
tcx.opt_local_parent(id.def_id).map_or(CRATE_HIR_ID, |parent| {
|
||||
let mut parent_hir_id = tcx.hir().local_def_id_to_hir_id(parent);
|
||||
if let Some(local_id) =
|
||||
tcx.hir_crate(()).owners[parent_hir_id.owner].unwrap().parenting.get(&id)
|
||||
if let Some(local_id) = tcx.hir_crate(()).owners[parent_hir_id.owner.def_id]
|
||||
.unwrap()
|
||||
.parenting
|
||||
.get(&id.def_id)
|
||||
{
|
||||
parent_hir_id.local_id = *local_id;
|
||||
}
|
||||
parent_hir_id
|
||||
})
|
||||
};
|
||||
providers.hir_attrs =
|
||||
|tcx, id| tcx.hir_crate(()).owners[id].as_owner().map_or(AttributeMap::EMPTY, |o| &o.attrs);
|
||||
providers.hir_attrs = |tcx, id| {
|
||||
tcx.hir_crate(()).owners[id.def_id].as_owner().map_or(AttributeMap::EMPTY, |o| &o.attrs)
|
||||
};
|
||||
providers.source_span =
|
||||
|tcx, def_id| tcx.resolutions(()).source_span.get(def_id).copied().unwrap_or(DUMMY_SP);
|
||||
providers.def_span = |tcx, def_id| {
|
||||
|
@ -177,6 +180,7 @@ pub fn provide(providers: &mut Providers) {
|
|||
let id = id.expect_local();
|
||||
tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root())
|
||||
};
|
||||
providers.in_scope_traits_map =
|
||||
|tcx, id| tcx.hir_crate(()).owners[id].as_owner().map(|owner_info| &owner_info.trait_map);
|
||||
providers.in_scope_traits_map = |tcx, id| {
|
||||
tcx.hir_crate(()).owners[id.def_id].as_owner().map(|owner_info| &owner_info.trait_map)
|
||||
};
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
use crate::ty;
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::ItemLocalId;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::{ItemLocalId, OwnerId};
|
||||
use rustc_macros::HashStable;
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable, Debug, HashStable)]
|
||||
|
@ -49,7 +49,7 @@ pub enum ObjectLifetimeDefault {
|
|||
pub struct ResolveLifetimes {
|
||||
/// Maps from every use of a named (not anonymous) lifetime to a
|
||||
/// `Region` describing how that region is bound
|
||||
pub defs: FxHashMap<LocalDefId, FxHashMap<ItemLocalId, Region>>,
|
||||
pub defs: FxHashMap<OwnerId, FxHashMap<ItemLocalId, Region>>,
|
||||
|
||||
pub late_bound_vars: FxHashMap<LocalDefId, FxHashMap<ItemLocalId, Vec<ty::BoundVariableKind>>>,
|
||||
pub late_bound_vars: FxHashMap<OwnerId, FxHashMap<ItemLocalId, Vec<ty::BoundVariableKind>>>,
|
||||
}
|
||||
|
|
|
@ -182,7 +182,7 @@ impl<'tcx> MonoItem<'tcx> {
|
|||
match *self {
|
||||
MonoItem::Fn(Instance { def, .. }) => def.def_id().as_local(),
|
||||
MonoItem::Static(def_id) => def_id.as_local(),
|
||||
MonoItem::GlobalAsm(item_id) => Some(item_id.def_id),
|
||||
MonoItem::GlobalAsm(item_id) => Some(item_id.def_id.def_id),
|
||||
}
|
||||
.map(|def_id| tcx.def_span(def_id))
|
||||
}
|
||||
|
@ -373,7 +373,7 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
}
|
||||
}
|
||||
MonoItem::Static(def_id) => def_id.as_local().map(Idx::index),
|
||||
MonoItem::GlobalAsm(item_id) => Some(item_id.def_id.index()),
|
||||
MonoItem::GlobalAsm(item_id) => Some(item_id.def_id.def_id.index()),
|
||||
},
|
||||
item.symbol_name(tcx),
|
||||
)
|
||||
|
|
|
@ -73,7 +73,7 @@ rustc_queries! {
|
|||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_owner(key: LocalDefId) -> Option<crate::hir::Owner<'tcx>> {
|
||||
query hir_owner(key: hir::OwnerId) -> Option<crate::hir::Owner<'tcx>> {
|
||||
desc { |tcx| "HIR owner of `{}`", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ rustc_queries! {
|
|||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_owner_parent(key: LocalDefId) -> hir::HirId {
|
||||
query hir_owner_parent(key: hir::OwnerId) -> hir::HirId {
|
||||
desc { |tcx| "HIR parent of `{}`", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ rustc_queries! {
|
|||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_owner_nodes(key: LocalDefId) -> hir::MaybeOwner<&'tcx hir::OwnerNodes<'tcx>> {
|
||||
query hir_owner_nodes(key: hir::OwnerId) -> hir::MaybeOwner<&'tcx hir::OwnerNodes<'tcx>> {
|
||||
desc { |tcx| "HIR owner items in `{}`", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ rustc_queries! {
|
|||
///
|
||||
/// This can be conveniently accessed by methods on `tcx.hir()`.
|
||||
/// Avoid calling this query directly.
|
||||
query hir_attrs(key: LocalDefId) -> &'tcx hir::AttributeMap<'tcx> {
|
||||
query hir_attrs(key: hir::OwnerId) -> &'tcx hir::AttributeMap<'tcx> {
|
||||
desc { |tcx| "HIR owner attributes in `{}`", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
||||
|
@ -1404,7 +1404,7 @@ rustc_queries! {
|
|||
query specializes(_: (DefId, DefId)) -> bool {
|
||||
desc { "computing whether impls specialize one another" }
|
||||
}
|
||||
query in_scope_traits_map(_: LocalDefId)
|
||||
query in_scope_traits_map(_: hir::OwnerId)
|
||||
-> Option<&'tcx FxHashMap<ItemLocalId, Box<[TraitCandidate]>>> {
|
||||
desc { "traits in scope at a block" }
|
||||
}
|
||||
|
@ -1419,7 +1419,7 @@ rustc_queries! {
|
|||
separate_provide_extern
|
||||
}
|
||||
|
||||
query check_well_formed(key: LocalDefId) -> () {
|
||||
query check_well_formed(key: hir::OwnerId) -> () {
|
||||
desc { |tcx| "checking that `{}` is well-formed", tcx.def_path_str(key.to_def_id()) }
|
||||
}
|
||||
|
||||
|
@ -1586,7 +1586,7 @@ rustc_queries! {
|
|||
arena_cache
|
||||
desc { "resolving lifetimes" }
|
||||
}
|
||||
query named_region_map(_: LocalDefId) ->
|
||||
query named_region_map(_: hir::OwnerId) ->
|
||||
Option<&'tcx FxHashMap<ItemLocalId, Region>> {
|
||||
desc { "looking up a named region" }
|
||||
}
|
||||
|
@ -1602,7 +1602,7 @@ rustc_queries! {
|
|||
desc { "looking up lifetime defaults for generic parameter `{}`", tcx.def_path_str(key) }
|
||||
separate_provide_extern
|
||||
}
|
||||
query late_bound_vars_map(_: LocalDefId)
|
||||
query late_bound_vars_map(_: hir::OwnerId)
|
||||
-> Option<&'tcx FxHashMap<ItemLocalId, Vec<ty::BoundVariableKind>>> {
|
||||
desc { "looking up late bound vars" }
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ use rustc_hir as hir;
|
|||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::Definitions;
|
||||
use rustc_hir::hir_id::OwnerId;
|
||||
use rustc_hir::intravisit::Visitor;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{
|
||||
|
@ -289,7 +290,7 @@ pub struct CommonConsts<'tcx> {
|
|||
}
|
||||
|
||||
pub struct LocalTableInContext<'a, V> {
|
||||
hir_owner: LocalDefId,
|
||||
hir_owner: OwnerId,
|
||||
data: &'a ItemLocalMap<V>,
|
||||
}
|
||||
|
||||
|
@ -301,7 +302,7 @@ pub struct LocalTableInContext<'a, V> {
|
|||
/// would result in lookup errors, or worse, in silently wrong data being
|
||||
/// stored/returned.
|
||||
#[inline]
|
||||
fn validate_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) {
|
||||
fn validate_hir_id_for_typeck_results(hir_owner: OwnerId, hir_id: hir::HirId) {
|
||||
if hir_id.owner != hir_owner {
|
||||
invalid_hir_id_for_typeck_results(hir_owner, hir_id);
|
||||
}
|
||||
|
@ -309,7 +310,7 @@ fn validate_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId)
|
|||
|
||||
#[cold]
|
||||
#[inline(never)]
|
||||
fn invalid_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) {
|
||||
fn invalid_hir_id_for_typeck_results(hir_owner: OwnerId, hir_id: hir::HirId) {
|
||||
ty::tls::with(|tcx| {
|
||||
bug!(
|
||||
"node {} with HirId::owner {:?} cannot be placed in TypeckResults with hir_owner {:?}",
|
||||
|
@ -345,7 +346,7 @@ impl<'a, V> ::std::ops::Index<hir::HirId> for LocalTableInContext<'a, V> {
|
|||
}
|
||||
|
||||
pub struct LocalTableInContextMut<'a, V> {
|
||||
hir_owner: LocalDefId,
|
||||
hir_owner: OwnerId,
|
||||
data: &'a mut ItemLocalMap<V>,
|
||||
}
|
||||
|
||||
|
@ -417,7 +418,7 @@ pub struct GeneratorDiagnosticData<'tcx> {
|
|||
#[derive(TyEncodable, TyDecodable, Debug, HashStable)]
|
||||
pub struct TypeckResults<'tcx> {
|
||||
/// The `HirId::owner` all `ItemLocalId`s in this table are relative to.
|
||||
pub hir_owner: LocalDefId,
|
||||
pub hir_owner: OwnerId,
|
||||
|
||||
/// Resolved definitions for `<T>::X` associated paths and
|
||||
/// method calls, including those of overloaded operators.
|
||||
|
@ -592,7 +593,7 @@ pub struct TypeckResults<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> TypeckResults<'tcx> {
|
||||
pub fn new(hir_owner: LocalDefId) -> TypeckResults<'tcx> {
|
||||
pub fn new(hir_owner: OwnerId) -> TypeckResults<'tcx> {
|
||||
TypeckResults {
|
||||
hir_owner,
|
||||
type_dependent_defs: Default::default(),
|
||||
|
@ -1726,7 +1727,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
|
||||
#[inline]
|
||||
pub fn local_visibility(self, def_id: LocalDefId) -> Visibility {
|
||||
self.visibility(def_id.to_def_id()).expect_local()
|
||||
self.visibility(def_id).expect_local()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2907,7 +2908,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
}
|
||||
|
||||
pub fn is_late_bound(self, id: HirId) -> bool {
|
||||
self.is_late_bound_map(id.owner).map_or(false, |set| {
|
||||
self.is_late_bound_map(id.owner.def_id).map_or(false, |set| {
|
||||
let def_id = self.hir().local_def_id(id);
|
||||
set.contains(&def_id)
|
||||
})
|
||||
|
|
|
@ -861,7 +861,7 @@ fn foo(&self) -> Self::T { String::new() }
|
|||
// When `body_owner` is an `impl` or `trait` item, look in its associated types for
|
||||
// `expected` and point at it.
|
||||
let parent_id = self.hir().get_parent_item(hir_id);
|
||||
let item = self.hir().find_by_def_id(parent_id);
|
||||
let item = self.hir().find_by_def_id(parent_id.def_id);
|
||||
debug!("expected_projection parent item {:?}", item);
|
||||
match item {
|
||||
Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Trait(.., items), .. })) => {
|
||||
|
|
|
@ -44,6 +44,7 @@ use rustc_errors::ErrorGuaranteed;
|
|||
use rustc_hir as hir;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId};
|
||||
use rustc_hir::hir_id::OwnerId;
|
||||
use rustc_hir::lang_items::{LangItem, LanguageItems};
|
||||
use rustc_hir::{Crate, ItemLocalId, TraitCandidate};
|
||||
use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec};
|
||||
|
@ -336,7 +337,7 @@ macro_rules! define_callbacks {
|
|||
rustc_query_append! { define_callbacks! }
|
||||
|
||||
mod sealed {
|
||||
use super::{DefId, LocalDefId};
|
||||
use super::{DefId, LocalDefId, OwnerId};
|
||||
|
||||
/// An analogue of the `Into` trait that's intended only for query parameters.
|
||||
///
|
||||
|
@ -366,6 +367,13 @@ mod sealed {
|
|||
self.to_def_id()
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoQueryParam<DefId> for OwnerId {
|
||||
#[inline(always)]
|
||||
fn into_query_param(self) -> DefId {
|
||||
self.to_def_id()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
use sealed::IntoQueryParam;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue