Note that type aliases cannot be recursive
This commit is contained in:
parent
2f48bfa88c
commit
cd0fc444fb
7 changed files with 84 additions and 2 deletions
|
@ -20,6 +20,12 @@ pub trait Key {
|
|||
/// In the event that a cycle occurs, if no explicit span has been
|
||||
/// given for a query with key `self`, what span should we use?
|
||||
fn default_span(&self, tcx: TyCtxt<'_>) -> Span;
|
||||
|
||||
/// If the key is a [`DefId`] or `DefId`--equivalent, return that `DefId`.
|
||||
/// Otherwise, return `None`.
|
||||
fn key_as_def_id(&self) -> Option<DefId> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl Key for () {
|
||||
|
@ -95,6 +101,9 @@ impl Key for LocalDefId {
|
|||
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
||||
self.to_def_id().default_span(tcx)
|
||||
}
|
||||
fn key_as_def_id(&self) -> Option<DefId> {
|
||||
Some(self.to_def_id())
|
||||
}
|
||||
}
|
||||
|
||||
impl Key for DefId {
|
||||
|
@ -105,6 +114,10 @@ impl Key for DefId {
|
|||
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
||||
tcx.def_span(*self)
|
||||
}
|
||||
#[inline(always)]
|
||||
fn key_as_def_id(&self) -> Option<DefId> {
|
||||
Some(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl Key for ty::WithOptConstParam<LocalDefId> {
|
||||
|
|
|
@ -51,6 +51,8 @@ pub use on_disk_cache::OnDiskCache;
|
|||
mod profiling_support;
|
||||
pub use self::profiling_support::alloc_self_profile_query_strings;
|
||||
|
||||
mod util;
|
||||
|
||||
rustc_query_append! { [define_queries!][<'tcx>] }
|
||||
|
||||
impl<'tcx> Queries<'tcx> {
|
||||
|
|
|
@ -337,6 +337,11 @@ macro_rules! define_queries {
|
|||
} else {
|
||||
Some(key.default_span(*tcx))
|
||||
};
|
||||
let def_id = key.key_as_def_id();
|
||||
let def_kind = def_id.map(|def_id| {
|
||||
let def_kind = tcx.def_kind(def_id);
|
||||
$crate::util::def_kind_to_simple_def_kind(def_kind)
|
||||
});
|
||||
let hash = || {
|
||||
let mut hcx = tcx.create_stable_hashing_context();
|
||||
let mut hasher = StableHasher::new();
|
||||
|
@ -345,7 +350,7 @@ macro_rules! define_queries {
|
|||
hasher.finish::<u64>()
|
||||
};
|
||||
|
||||
QueryStackFrame::new(name, description, span, hash)
|
||||
QueryStackFrame::new(name, description, span, def_kind, hash)
|
||||
})*
|
||||
}
|
||||
|
||||
|
|
18
compiler/rustc_query_impl/src/util.rs
Normal file
18
compiler/rustc_query_impl/src/util.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
use rustc_hir::def::DefKind;
|
||||
use rustc_query_system::query::SimpleDefKind;
|
||||
|
||||
/// Convert a [`DefKind`] to a [`SimpleDefKind`].
|
||||
///
|
||||
/// *See [`SimpleDefKind`]'s docs for more information.*
|
||||
pub(crate) fn def_kind_to_simple_def_kind(def_kind: DefKind) -> SimpleDefKind {
|
||||
match def_kind {
|
||||
DefKind::Struct => SimpleDefKind::Struct,
|
||||
DefKind::Enum => SimpleDefKind::Enum,
|
||||
DefKind::Union => SimpleDefKind::Union,
|
||||
DefKind::Trait => SimpleDefKind::Trait,
|
||||
DefKind::TyAlias => SimpleDefKind::TyAlias,
|
||||
DefKind::TraitAlias => SimpleDefKind::TraitAlias,
|
||||
|
||||
_ => SimpleDefKind::Other,
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue