Skip to main content

rustc_metadata/rmeta/
parameterized.rs

1use std::hash::Hash;
2
3use rustc_data_structures::unord::UnordMap;
4use rustc_hir::def_id::DefIndex;
5use rustc_index::{Idx, IndexVec};
6use rustc_middle::ty::{Binder, EarlyBinder, GenericArg, Region};
7use rustc_span::Symbol;
8
9use crate::rmeta::{LazyArray, LazyValue};
10
11pub(crate) trait ParameterizedOverTcx: 'static {
12    type Value<'tcx>;
13}
14
15impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Option<T> {
16    type Value<'tcx> = Option<T::Value<'tcx>>;
17}
18
19impl<A: ParameterizedOverTcx, B: ParameterizedOverTcx> ParameterizedOverTcx for (A, B) {
20    type Value<'tcx> = (A::Value<'tcx>, B::Value<'tcx>);
21}
22
23impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Vec<T> {
24    type Value<'tcx> = Vec<T::Value<'tcx>>;
25}
26
27impl<I: Idx + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for IndexVec<I, T> {
28    type Value<'tcx> = IndexVec<I, T::Value<'tcx>>;
29}
30
31impl<I: Hash + Eq + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for UnordMap<I, T> {
32    type Value<'tcx> = UnordMap<I, T::Value<'tcx>>;
33}
34
35impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Binder<'static, T> {
36    type Value<'tcx> = Binder<'tcx, T::Value<'tcx>>;
37}
38
39impl<T: ParameterizedOverTcx> ParameterizedOverTcx for EarlyBinder<'static, T> {
40    type Value<'tcx> = EarlyBinder<'tcx, T::Value<'tcx>>;
41}
42
43impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyValue<T> {
44    type Value<'tcx> = LazyValue<T::Value<'tcx>>;
45}
46
47impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyArray<T> {
48    type Value<'tcx> = LazyArray<T::Value<'tcx>>;
49}
50
51impl ParameterizedOverTcx for Region<'static> {
52    type Value<'tcx> = Region<'tcx>;
53}
54
55impl ParameterizedOverTcx for GenericArg<'static> {
56    type Value<'tcx> = GenericArg<'tcx>;
57}
58
59macro_rules! trivially_parameterized_over_tcx {
60    ($($ty:ty),+ $(,)?) => {
61        $(
62            impl ParameterizedOverTcx for $ty {
63                #[allow(unused_lifetimes)]
64                type Value<'tcx> = $ty;
65            }
66        )*
67    }
68}
69
70impl ParameterizedOverTcx for bool {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = bool;
}
impl ParameterizedOverTcx for u32 {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = u32;
}
impl ParameterizedOverTcx for u64 {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = u64;
}
impl ParameterizedOverTcx for usize {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = usize;
}
impl ParameterizedOverTcx for std::string::String {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = std::string::String;
}
impl ParameterizedOverTcx for crate::rmeta::AttrFlags {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::AttrFlags;
}
impl ParameterizedOverTcx for crate::rmeta::CrateDep {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::CrateDep;
}
impl ParameterizedOverTcx for crate::rmeta::CrateHeader {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::CrateHeader;
}
impl ParameterizedOverTcx for crate::rmeta::CrateRoot {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::CrateRoot;
}
impl ParameterizedOverTcx for crate::rmeta::IncoherentImpls {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::IncoherentImpls;
}
impl ParameterizedOverTcx for crate::rmeta::ProcMacroKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::ProcMacroKind;
}
impl ParameterizedOverTcx for crate::rmeta::RawDefId {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::RawDefId;
}
impl ParameterizedOverTcx for crate::rmeta::TraitImpls {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::TraitImpls;
}
impl ParameterizedOverTcx for crate::rmeta::VariantData {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::VariantData;
}
impl ParameterizedOverTcx for rustc_abi::ReprOptions {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_abi::ReprOptions;
}
impl ParameterizedOverTcx for rustc_ast::DelimArgs {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_ast::DelimArgs;
}
impl ParameterizedOverTcx for rustc_crate_store::ForeignModule {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_crate_store::ForeignModule;
}
impl ParameterizedOverTcx for rustc_crate_store::LinkagePreference {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_crate_store::LinkagePreference;
}
impl ParameterizedOverTcx for rustc_crate_store::NativeLib {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_crate_store::NativeLib;
}
impl ParameterizedOverTcx for rustc_hir::Attribute {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::Attribute;
}
impl ParameterizedOverTcx for rustc_hir::ConstStability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::ConstStability;
}
impl ParameterizedOverTcx for rustc_hir::Constness {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::Constness;
}
impl ParameterizedOverTcx for rustc_hir::CoroutineKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::CoroutineKind;
}
impl ParameterizedOverTcx for rustc_hir::DefaultBodyStability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::DefaultBodyStability;
}
impl ParameterizedOverTcx for rustc_hir::Defaultness {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::Defaultness;
}
impl ParameterizedOverTcx for
    rustc_hir::OpaqueTyOrigin<rustc_hir::def_id::DefId> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::OpaqueTyOrigin<rustc_hir::def_id::DefId>;
}
impl ParameterizedOverTcx for
    rustc_hir::PreciseCapturingArgKind<Symbol, Symbol> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::PreciseCapturingArgKind<Symbol, Symbol>;
}
impl ParameterizedOverTcx for rustc_hir::Safety {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::Safety;
}
impl ParameterizedOverTcx for rustc_hir::Stability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::Stability;
}
impl ParameterizedOverTcx for rustc_hir::attrs::Deprecation {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::attrs::Deprecation;
}
impl ParameterizedOverTcx for rustc_hir::attrs::EiiDecl {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::attrs::EiiDecl;
}
impl ParameterizedOverTcx for rustc_hir::attrs::EiiImpl {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::attrs::EiiImpl;
}
impl ParameterizedOverTcx for
    rustc_hir::attrs::StrippedCfgItem<rustc_hir::def_id::DefIndex> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_hir::attrs::StrippedCfgItem<rustc_hir::def_id::DefIndex>;
}
impl ParameterizedOverTcx for rustc_hir::attrs::lang_items::LangItem {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::attrs::lang_items::LangItem;
}
impl ParameterizedOverTcx for rustc_hir::def::DefKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::def::DefKind;
}
impl ParameterizedOverTcx for rustc_hir::def_id::DefId {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::def_id::DefId;
}
impl ParameterizedOverTcx for rustc_hir::def_id::DefIndex {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::def_id::DefIndex;
}
impl ParameterizedOverTcx for rustc_hir::definitions::DefKey {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_hir::definitions::DefKey;
}
impl ParameterizedOverTcx for rustc_index::bit_set::DenseBitSet<u32> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_index::bit_set::DenseBitSet<u32>;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::deduced_param_attrs::DeducedParamAttrs {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_middle::middle::deduced_param_attrs::DeducedParamAttrs;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::exported_symbols::SymbolExportInfo {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_middle::middle::exported_symbols::SymbolExportInfo;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::lib_features::FeatureStability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::middle::lib_features::FeatureStability;
}
impl ParameterizedOverTcx for rustc_middle::middle::resolve::AmbigModChild {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::middle::resolve::AmbigModChild;
}
impl ParameterizedOverTcx for rustc_middle::middle::resolve::DocLinkResMap {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::middle::resolve::DocLinkResMap;
}
impl ParameterizedOverTcx for rustc_middle::middle::resolve::ModChild {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::middle::resolve::ModChild;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
}
impl ParameterizedOverTcx for rustc_middle::mir::ConstQualifs {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::mir::ConstQualifs;
}
impl ParameterizedOverTcx for rustc_middle::mir::ConstValue {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::mir::ConstValue;
}
impl ParameterizedOverTcx for rustc_middle::ty::AnonConstKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::AnonConstKind;
}
impl ParameterizedOverTcx for rustc_middle::ty::AssocContainer {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::AssocContainer;
}
impl ParameterizedOverTcx for rustc_middle::ty::AsyncDestructor {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::AsyncDestructor;
}
impl ParameterizedOverTcx for rustc_middle::ty::Asyncness {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Asyncness;
}
impl ParameterizedOverTcx for rustc_middle::ty::Destructor {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Destructor;
}
impl ParameterizedOverTcx for rustc_middle::ty::Generics {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Generics;
}
impl ParameterizedOverTcx for rustc_middle::ty::ImplTraitInTraitData {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::ImplTraitInTraitData;
}
impl ParameterizedOverTcx for rustc_middle::ty::IntrinsicDef {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::IntrinsicDef;
}
impl ParameterizedOverTcx for rustc_middle::ty::RestrictionKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::RestrictionKind;
}
impl ParameterizedOverTcx for rustc_middle::ty::TraitDef {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::TraitDef;
}
impl ParameterizedOverTcx for rustc_middle::ty::Variance {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Variance;
}
impl ParameterizedOverTcx for rustc_middle::ty::Visibility<DefIndex> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Visibility<DefIndex>;
}
impl ParameterizedOverTcx for rustc_middle::ty::adjustment::CoerceUnsizedInfo
    {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::adjustment::CoerceUnsizedInfo;
}
impl ParameterizedOverTcx for rustc_middle::ty::fast_reject::SimplifiedType {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::fast_reject::SimplifiedType;
}
impl ParameterizedOverTcx for rustc_session::config::TargetModifier {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_session::config::TargetModifier;
}
impl ParameterizedOverTcx for
    rustc_session::config::mitigation_coverage::DeniedPartialMitigation {
    #[allow(unused_lifetimes)]
    type Value<'tcx> =
        rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
}
impl ParameterizedOverTcx for rustc_span::ExpnData {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::ExpnData;
}
impl ParameterizedOverTcx for rustc_span::ExpnHash {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::ExpnHash;
}
impl ParameterizedOverTcx for rustc_span::ExpnId {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::ExpnId;
}
impl ParameterizedOverTcx for rustc_span::Ident {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::Ident;
}
impl ParameterizedOverTcx for rustc_span::SourceFile {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::SourceFile;
}
impl ParameterizedOverTcx for rustc_span::Span {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::Span;
}
impl ParameterizedOverTcx for rustc_span::Symbol {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::Symbol;
}
impl ParameterizedOverTcx for rustc_span::hygiene::SyntaxContextKey {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_span::hygiene::SyntaxContextKey;
}trivially_parameterized_over_tcx! {
71    bool,
72    u32,
73    u64,
74    usize,
75    std::string::String,
76    // tidy-alphabetical-start
77    crate::rmeta::AttrFlags,
78    crate::rmeta::CrateDep,
79    crate::rmeta::CrateHeader,
80    crate::rmeta::CrateRoot,
81    crate::rmeta::IncoherentImpls,
82    crate::rmeta::ProcMacroKind,
83    crate::rmeta::RawDefId,
84    crate::rmeta::TraitImpls,
85    crate::rmeta::VariantData,
86    rustc_abi::ReprOptions,
87    rustc_ast::DelimArgs,
88    rustc_crate_store::ForeignModule,
89    rustc_crate_store::LinkagePreference,
90    rustc_crate_store::NativeLib,
91    rustc_hir::Attribute,
92    rustc_hir::ConstStability,
93    rustc_hir::Constness,
94    rustc_hir::CoroutineKind,
95    rustc_hir::DefaultBodyStability,
96    rustc_hir::Defaultness,
97    rustc_hir::OpaqueTyOrigin<rustc_hir::def_id::DefId>,
98    rustc_hir::PreciseCapturingArgKind<Symbol, Symbol>,
99    rustc_hir::Safety,
100    rustc_hir::Stability,
101    rustc_hir::attrs::Deprecation,
102    rustc_hir::attrs::EiiDecl,
103    rustc_hir::attrs::EiiImpl,
104    rustc_hir::attrs::StrippedCfgItem<rustc_hir::def_id::DefIndex>,
105    rustc_hir::attrs::lang_items::LangItem,
106    rustc_hir::def::DefKind,
107    rustc_hir::def_id::DefId,
108    rustc_hir::def_id::DefIndex,
109    rustc_hir::definitions::DefKey,
110    rustc_index::bit_set::DenseBitSet<u32>,
111    rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs,
112    rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile,
113    rustc_middle::middle::deduced_param_attrs::DeducedParamAttrs,
114    rustc_middle::middle::exported_symbols::SymbolExportInfo,
115    rustc_middle::middle::lib_features::FeatureStability,
116    rustc_middle::middle::resolve::AmbigModChild,
117    rustc_middle::middle::resolve::DocLinkResMap,
118    rustc_middle::middle::resolve::ModChild,
119    rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault,
120    rustc_middle::mir::ConstQualifs,
121    rustc_middle::mir::ConstValue,
122    rustc_middle::ty::AnonConstKind,
123    rustc_middle::ty::AssocContainer,
124    rustc_middle::ty::AsyncDestructor,
125    rustc_middle::ty::Asyncness,
126    rustc_middle::ty::Destructor,
127    rustc_middle::ty::Generics,
128    rustc_middle::ty::ImplTraitInTraitData,
129    rustc_middle::ty::IntrinsicDef,
130    rustc_middle::ty::RestrictionKind,
131    rustc_middle::ty::TraitDef,
132    rustc_middle::ty::Variance,
133    rustc_middle::ty::Visibility<DefIndex>,
134    rustc_middle::ty::adjustment::CoerceUnsizedInfo,
135    rustc_middle::ty::fast_reject::SimplifiedType,
136    rustc_session::config::TargetModifier,
137    rustc_session::config::mitigation_coverage::DeniedPartialMitigation,
138    rustc_span::ExpnData,
139    rustc_span::ExpnHash,
140    rustc_span::ExpnId,
141    rustc_span::Ident,
142    rustc_span::SourceFile,
143    rustc_span::Span,
144    rustc_span::Symbol,
145    rustc_span::hygiene::SyntaxContextKey,
146    // tidy-alphabetical-end
147}
148
149// HACK(compiler-errors): This macro rule can only take a fake path,
150// not a real, due to parsing ambiguity reasons.
151macro_rules! parameterized_over_tcx {
152    ($($( $fake_path:ident )::+ ),+ $(,)?) => {
153        $(
154            impl ParameterizedOverTcx for $( $fake_path )::+ <'static> {
155                type Value<'tcx> = $( $fake_path )::+ <'tcx>;
156            }
157        )*
158    }
159}
160
161impl ParameterizedOverTcx for crate::rmeta::DefPathHashMapRef<'static> {
    type Value<'tcx> = crate::rmeta::DefPathHashMapRef<'tcx>;
}
impl ParameterizedOverTcx for
    rustc_middle::middle::exported_symbols::ExportedSymbol<'static> {
    type Value<'tcx> =
        rustc_middle::middle::exported_symbols::ExportedSymbol<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::mir::Body<'static> {
    type Value<'tcx> = rustc_middle::mir::Body<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::mir::CoroutineLayout<'static> {
    type Value<'tcx> = rustc_middle::mir::CoroutineLayout<'tcx>;
}
impl ParameterizedOverTcx for
    rustc_middle::mir::interpret::ConstAllocation<'static> {
    type Value<'tcx> = rustc_middle::mir::interpret::ConstAllocation<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::Clause<'static> {
    type Value<'tcx> = rustc_middle::ty::Clause<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::Const<'static> {
    type Value<'tcx> = rustc_middle::ty::Const<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::ConstConditions<'static> {
    type Value<'tcx> = rustc_middle::ty::ConstConditions<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::FnSig<'static> {
    type Value<'tcx> = rustc_middle::ty::FnSig<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::GenericClauses<'static> {
    type Value<'tcx> = rustc_middle::ty::GenericClauses<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::ImplTraitHeader<'static> {
    type Value<'tcx> = rustc_middle::ty::ImplTraitHeader<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::TraitRef<'static> {
    type Value<'tcx> = rustc_middle::ty::TraitRef<'tcx>;
}
impl ParameterizedOverTcx for rustc_middle::ty::Ty<'static> {
    type Value<'tcx> = rustc_middle::ty::Ty<'tcx>;
}parameterized_over_tcx! {
162    // tidy-alphabetical-start
163    crate::rmeta::DefPathHashMapRef,
164    rustc_middle::middle::exported_symbols::ExportedSymbol,
165    rustc_middle::mir::Body,
166    rustc_middle::mir::CoroutineLayout,
167    rustc_middle::mir::interpret::ConstAllocation,
168    rustc_middle::ty::Clause,
169    rustc_middle::ty::Const,
170    rustc_middle::ty::ConstConditions,
171    rustc_middle::ty::FnSig,
172    rustc_middle::ty::GenericClauses,
173    rustc_middle::ty::ImplTraitHeader,
174    rustc_middle::ty::TraitRef,
175    rustc_middle::ty::Ty,
176    // tidy-alphabetical-end
177}