rustc_middle/ty/
parameterized.rs

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