1use std::hash::Hash;
2
3use rustc_data_structures::unord::UnordMap;
4use rustc_hir::def_id::DefIndex;
5use rustc_index::{Idx, IndexVec};
6use rustc_span::Symbol;
7
8use crate::ty;
9
10pub trait ParameterizedOverTcx: 'static {
11 type Value<'tcx>;
12}
13
14impl<T: ParameterizedOverTcx> ParameterizedOverTcx for &'static [T] {
15 type Value<'tcx> = &'tcx [T::Value<'tcx>];
16}
17
18impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Option<T> {
19 type Value<'tcx> = Option<T::Value<'tcx>>;
20}
21
22impl<A: ParameterizedOverTcx, B: ParameterizedOverTcx> ParameterizedOverTcx for (A, B) {
23 type Value<'tcx> = (A::Value<'tcx>, B::Value<'tcx>);
24}
25
26impl<I: Idx + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for IndexVec<I, T> {
27 type Value<'tcx> = IndexVec<I, T::Value<'tcx>>;
28}
29
30impl<I: Hash + Eq + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for UnordMap<I, T> {
31 type Value<'tcx> = UnordMap<I, T::Value<'tcx>>;
32}
33
34impl<T: ParameterizedOverTcx> ParameterizedOverTcx for ty::Binder<'static, T> {
35 type Value<'tcx> = ty::Binder<'tcx, T::Value<'tcx>>;
36}
37
38impl<T: ParameterizedOverTcx> ParameterizedOverTcx for ty::EarlyBinder<'static, T> {
39 type Value<'tcx> = ty::EarlyBinder<'tcx, T::Value<'tcx>>;
40}
41
42#[macro_export]
43macro_rules! trivially_parameterized_over_tcx {
44 ($($ty:ty),+ $(,)?) => {
45 $(
46 impl $crate::ty::ParameterizedOverTcx for $ty {
47 #[allow(unused_lifetimes)]
48 type Value<'tcx> = $ty;
49 }
50 )*
51 }
52}
53
54trivially_parameterized_over_tcx! {
55 usize,
56 (),
57 u32,
58 u64,
59 bool,
60 std::string::String,
61 crate::metadata::ModChild,
62 crate::middle::codegen_fn_attrs::CodegenFnAttrs,
63 crate::middle::debugger_visualizer::DebuggerVisualizerFile,
64 crate::middle::exported_symbols::SymbolExportInfo,
65 crate::middle::lib_features::FeatureStability,
66 crate::middle::resolve_bound_vars::ObjectLifetimeDefault,
67 crate::mir::ConstQualifs,
68 ty::AsyncDestructor,
69 ty::AssocItemContainer,
70 ty::Asyncness,
71 ty::DeducedParamAttrs,
72 ty::Destructor,
73 ty::Generics,
74 ty::ImplPolarity,
75 ty::ImplTraitInTraitData,
76 ty::ReprOptions,
77 ty::TraitDef,
78 ty::UnusedGenericParams,
79 ty::Visibility<DefIndex>,
80 ty::adjustment::CoerceUnsizedInfo,
81 ty::fast_reject::SimplifiedType,
82 ty::IntrinsicDef,
83 rustc_ast::Attribute,
84 rustc_ast::DelimArgs,
85 rustc_ast::expand::StrippedCfgItem<rustc_hir::def_id::DefIndex>,
86 rustc_attr_data_structures::ConstStability,
87 rustc_attr_data_structures::DefaultBodyStability,
88 rustc_attr_data_structures::Deprecation,
89 rustc_attr_data_structures::Stability,
90 rustc_hir::Constness,
91 rustc_hir::Defaultness,
92 rustc_hir::Safety,
93 rustc_hir::CoroutineKind,
94 rustc_hir::IsAsync,
95 rustc_hir::LangItem,
96 rustc_hir::def::DefKind,
97 rustc_hir::def::DocLinkResMap,
98 rustc_hir::def_id::DefId,
99 rustc_hir::def_id::DefIndex,
100 rustc_hir::definitions::DefKey,
101 rustc_hir::OpaqueTyOrigin<rustc_hir::def_id::DefId>,
102 rustc_hir::PreciseCapturingArgKind<Symbol, Symbol>,
103 rustc_index::bit_set::DenseBitSet<u32>,
104 rustc_index::bit_set::FiniteBitSet<u32>,
105 rustc_session::cstore::ForeignModule,
106 rustc_session::cstore::LinkagePreference,
107 rustc_session::cstore::NativeLib,
108 rustc_session::config::TargetModifier,
109 rustc_span::ExpnData,
110 rustc_span::ExpnHash,
111 rustc_span::ExpnId,
112 rustc_span::SourceFile,
113 rustc_span::Span,
114 rustc_span::Symbol,
115 rustc_span::def_id::DefPathHash,
116 rustc_span::hygiene::SyntaxContextKey,
117 rustc_span::Ident,
118 rustc_type_ir::Variance,
119 rustc_hir::Attribute,
120}
121
122#[macro_export]
125macro_rules! parameterized_over_tcx {
126 ($($($fake_path:ident)::+),+ $(,)?) => {
127 $(
128 impl $crate::ty::ParameterizedOverTcx for $($fake_path)::+<'static> {
129 type Value<'tcx> = $($fake_path)::+<'tcx>;
130 }
131 )*
132 }
133}
134
135parameterized_over_tcx! {
136 crate::middle::exported_symbols::ExportedSymbol,
137 crate::mir::Body,
138 crate::mir::CoroutineLayout,
139 crate::mir::interpret::ConstAllocation,
140 ty::Ty,
141 ty::FnSig,
142 ty::GenericPredicates,
143 ty::ConstConditions,
144 ty::TraitRef,
145 ty::Const,
146 ty::Predicate,
147 ty::Clause,
148 ty::ClauseKind,
149 ty::ImplTraitHeader,
150}