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 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 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::DocLinkResMap,
108 rustc_hir::def_id::DefId,
109 rustc_hir::def_id::DefIndex,
110 rustc_hir::definitions::DefKey,
111 rustc_index::bit_set::DenseBitSet<u32>,
112 rustc_middle::metadata::AmbigModChild,
113 rustc_middle::metadata::ModChild,
114 rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs,
115 rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile,
116 rustc_middle::middle::deduced_param_attrs::DeducedParamAttrs,
117 rustc_middle::middle::exported_symbols::SymbolExportInfo,
118 rustc_middle::middle::lib_features::FeatureStability,
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 }
148
149macro_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 rustc_middle::ty::Ty<'static> {
type Value<'tcx> = rustc_middle::ty::Ty<'tcx>;
}parameterized_over_tcx! {
162 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 }