Skip to main content

rustc_metadata/rmeta/
parameterized.rs

1use std::hash::Hash;
2
3use rustc_data_structures::unord::UnordMap;
4use rustc_index::{Idx, IndexVec};
5use rustc_middle::ty::{Binder, EarlyBinder, GenericArg, Region, Ty};
6use rustc_serialize::Encodable;
7use rustc_span::Symbol;
8
9use crate::rmeta::encoder::EncodeContext;
10use crate::rmeta::{LazyArray, LazyValue, LocalDefId};
11
12pub(crate) trait ParameterizedOverTcx: 'static {
13    type Value<'tcx>;
14}
15
16impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Option<T> {
17    type Value<'tcx> = Option<T::Value<'tcx>>;
18}
19
20impl<A: ParameterizedOverTcx, B: ParameterizedOverTcx> ParameterizedOverTcx for (A, B) {
21    type Value<'tcx> = (A::Value<'tcx>, B::Value<'tcx>);
22}
23
24impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Vec<T> {
25    type Value<'tcx> = Vec<T::Value<'tcx>>;
26}
27
28impl<I: Idx + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for IndexVec<I, T> {
29    type Value<'tcx> = IndexVec<I, T::Value<'tcx>>;
30}
31
32impl<I: Hash + Eq + 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for UnordMap<I, T> {
33    type Value<'tcx> = UnordMap<I, T::Value<'tcx>>;
34}
35
36impl<T: ParameterizedOverTcx> ParameterizedOverTcx for Binder<'static, T> {
37    type Value<'tcx> = Binder<'tcx, T::Value<'tcx>>;
38}
39
40impl<T: ParameterizedOverTcx> ParameterizedOverTcx for EarlyBinder<'static, T> {
41    type Value<'tcx> = EarlyBinder<'tcx, T::Value<'tcx>>;
42}
43
44impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyValue<T> {
45    type Value<'tcx> = LazyValue<T::Value<'tcx>>;
46}
47
48impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyArray<T> {
49    type Value<'tcx> = LazyArray<T::Value<'tcx>>;
50}
51
52impl ParameterizedOverTcx for Region<'static> {
53    type Value<'tcx> = Region<'tcx>;
54}
55
56impl ParameterizedOverTcx for GenericArg<'static> {
57    type Value<'tcx> = GenericArg<'tcx>;
58}
59
60macro_rules! trivially_parameterized_over_tcx {
61    ($($ty:ty),+ $(,)?) => {
62        $(
63            impl ParameterizedOverTcx for $ty {
64                #[allow(unused_lifetimes)]
65                type Value<'tcx> = $ty;
66            }
67        )*
68    }
69}
70
71impl 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::CrateRootUnhashed {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::CrateRootUnhashed;
}
impl ParameterizedOverTcx for crate::rmeta::IncoherentImpls {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::IncoherentImpls;
}
impl ParameterizedOverTcx for crate::rmeta::LocalDefId {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::LocalDefId;
}
impl ParameterizedOverTcx for crate::rmeta::ProcMacroKind {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::ProcMacroKind;
}
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 crate::rmeta::remapped_def_id::RemappedRawDefId
    {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = crate::rmeta::remapped_def_id::RemappedRawDefId;
}
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_attr_ir::Attribute {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::Attribute;
}
impl ParameterizedOverTcx for rustc_attr_ir::ConstStability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::ConstStability;
}
impl ParameterizedOverTcx for rustc_attr_ir::DefaultBodyStability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::DefaultBodyStability;
}
impl ParameterizedOverTcx for rustc_attr_ir::Deprecation {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::Deprecation;
}
impl ParameterizedOverTcx for rustc_attr_ir::EiiDecl {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::EiiDecl;
}
impl ParameterizedOverTcx for rustc_attr_ir::EiiImpl {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::EiiImpl;
}
impl ParameterizedOverTcx for rustc_attr_ir::Stability {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::Stability;
}
impl ParameterizedOverTcx for rustc_attr_ir::StrippedCfgItem<LocalDefId> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::StrippedCfgItem<LocalDefId>;
}
impl ParameterizedOverTcx for rustc_attr_ir::lang_items::LangItem {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_attr_ir::lang_items::LangItem;
}
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::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::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::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<LocalDefId> {
    #[allow(unused_lifetimes)]
    type Value<'tcx> = rustc_middle::ty::Visibility<LocalDefId>;
}
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! {
72    bool,
73    u32,
74    u64,
75    usize,
76    std::string::String,
77    // tidy-alphabetical-start
78    crate::rmeta::AttrFlags,
79    crate::rmeta::CrateDep,
80    crate::rmeta::CrateHeader,
81    crate::rmeta::CrateRoot,
82    crate::rmeta::CrateRootUnhashed,
83    crate::rmeta::IncoherentImpls,
84    crate::rmeta::LocalDefId,
85    crate::rmeta::ProcMacroKind,
86    crate::rmeta::TraitImpls,
87    crate::rmeta::VariantData,
88    crate::rmeta::remapped_def_id::RemappedRawDefId,
89    rustc_abi::ReprOptions,
90    rustc_ast::DelimArgs,
91    rustc_attr_ir::Attribute,
92    rustc_attr_ir::ConstStability,
93    rustc_attr_ir::DefaultBodyStability,
94    rustc_attr_ir::Deprecation,
95    rustc_attr_ir::EiiDecl,
96    rustc_attr_ir::EiiImpl,
97    rustc_attr_ir::Stability,
98    rustc_attr_ir::StrippedCfgItem<LocalDefId>,
99    rustc_attr_ir::lang_items::LangItem,
100    rustc_crate_store::ForeignModule,
101    rustc_crate_store::LinkagePreference,
102    rustc_crate_store::NativeLib,
103    rustc_hir::Constness,
104    rustc_hir::CoroutineKind,
105    rustc_hir::Defaultness,
106    rustc_hir::OpaqueTyOrigin<rustc_hir::def_id::DefId>,
107    rustc_hir::PreciseCapturingArgKind<Symbol, Symbol>,
108    rustc_hir::Safety,
109    rustc_hir::def::DefKind,
110    rustc_hir::def_id::DefId,
111    rustc_hir::def_id::DefIndex,
112    rustc_hir::definitions::DefKey,
113    rustc_index::bit_set::DenseBitSet<u32>,
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::AmbigModChild,
120    rustc_middle::middle::resolve::DocLinkResMap,
121    rustc_middle::middle::resolve::ModChild,
122    rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault,
123    rustc_middle::mir::ConstQualifs,
124    rustc_middle::mir::ConstValue,
125    rustc_middle::ty::AnonConstKind,
126    rustc_middle::ty::AssocContainer,
127    rustc_middle::ty::AsyncDestructor,
128    rustc_middle::ty::Asyncness,
129    rustc_middle::ty::Destructor,
130    rustc_middle::ty::Generics,
131    rustc_middle::ty::ImplTraitInTraitData,
132    rustc_middle::ty::IntrinsicDef,
133    rustc_middle::ty::RestrictionKind,
134    rustc_middle::ty::TraitDef,
135    rustc_middle::ty::Variance,
136    rustc_middle::ty::Visibility<LocalDefId>,
137    rustc_middle::ty::adjustment::CoerceUnsizedInfo,
138    rustc_middle::ty::fast_reject::SimplifiedType,
139    rustc_session::config::TargetModifier,
140    rustc_session::config::mitigation_coverage::DeniedPartialMitigation,
141    rustc_span::ExpnData,
142    rustc_span::ExpnHash,
143    rustc_span::ExpnId,
144    rustc_span::Ident,
145    rustc_span::SourceFile,
146    rustc_span::Span,
147    rustc_span::Symbol,
148    rustc_span::hygiene::SyntaxContextKey,
149    // tidy-alphabetical-end
150}
151
152// HACK(compiler-errors): This macro rule can only take a fake path,
153// not a real, due to parsing ambiguity reasons.
154macro_rules! parameterized_over_tcx {
155    ($($( $fake_path:ident )::+ ),+ $(,)?) => {
156        $(
157            impl ParameterizedOverTcx for $( $fake_path )::+ <'static> {
158                type Value<'tcx> = $( $fake_path )::+ <'tcx>;
159            }
160        )*
161    }
162}
163
164impl 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! {
165    // tidy-alphabetical-start
166    crate::rmeta::DefPathHashMapRef,
167    rustc_middle::middle::exported_symbols::ExportedSymbol,
168    rustc_middle::mir::Body,
169    rustc_middle::mir::CoroutineLayout,
170    rustc_middle::mir::interpret::ConstAllocation,
171    rustc_middle::ty::Clause,
172    rustc_middle::ty::Const,
173    rustc_middle::ty::ConstConditions,
174    rustc_middle::ty::FnSig,
175    rustc_middle::ty::GenericClauses,
176    rustc_middle::ty::ImplTraitHeader,
177    rustc_middle::ty::TraitRef,
178    rustc_middle::ty::Ty,
179    // tidy-alphabetical-end
180}
181
182/// Converts values from `TyCtxt` stored form into metadata table stored form
183pub(super) trait EncodeFrom<'tcx, T> {
184    /// When a `T` is trivial to encode, it has a fixed size, no pointers inside, this can be
185    /// just a no-op. For more complex types this usually creates a `LazyValue<T>` or `LazyArray<T>`
186    /// encoding `value` with `encoder` in the process
187    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: T) -> Self;
188}
189
190macro_rules! trivial_encode_from {
191    (
192        $($ty:ty,)+
193    ) => {
194        $(
195            impl<'tcx> EncodeFrom<'tcx, $ty> for $ty {
196                fn encode_from<'a>(
197                    _encoder: &mut EncodeContext<'a, 'tcx>,
198                    value: $ty,
199                ) -> $ty {
200                    value
201                }
202            }
203        )+
204    };
205}
206
207macro_rules! lazy_encode_from {
208    (
209        $($ty:ty,)+
210    ) => {
211        $(
212            impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<$ty>
213            where
214                B: std::borrow::Borrow<<$ty as ParameterizedOverTcx>::Value<'tcx>>
215            {
216                fn encode_from<'a>(
217                    encoder: &mut EncodeContext<'a, 'tcx>,
218                    value: B,
219                ) -> LazyValue<$ty> {
220                    encoder.lazy(value)
221                }
222            }
223        )+
224    };
225}
226
227impl<'tcx> EncodeFrom<'tcx, bool> for bool {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>, value: bool)
        -> bool {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, u64> for u64 {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>, value: u64)
        -> u64 {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, crate::rmeta::AttrFlags> for
    crate::rmeta::AttrFlags {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: crate::rmeta::AttrFlags) -> crate::rmeta::AttrFlags {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, crate::rmeta::remapped_def_id::RemappedRawDefId>
    for crate::rmeta::remapped_def_id::RemappedRawDefId {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: crate::rmeta::remapped_def_id::RemappedRawDefId)
        -> crate::rmeta::remapped_def_id::RemappedRawDefId {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_hir::Constness> for rustc_hir::Constness {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_hir::Constness) -> rustc_hir::Constness {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_hir::CoroutineKind> for
    rustc_hir::CoroutineKind {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_hir::CoroutineKind) -> rustc_hir::CoroutineKind {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_hir::Defaultness> for rustc_hir::Defaultness
    {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_hir::Defaultness) -> rustc_hir::Defaultness {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_hir::Safety> for rustc_hir::Safety {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_hir::Safety) -> rustc_hir::Safety {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_hir::def::DefKind> for
    rustc_hir::def::DefKind {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_hir::def::DefKind) -> rustc_hir::def::DefKind {
        value
    }
}
impl<'tcx> EncodeFrom<'tcx, rustc_middle::ty::Asyncness> for
    rustc_middle::ty::Asyncness {
    fn encode_from<'a>(_encoder: &mut EncodeContext<'a, 'tcx>,
        value: rustc_middle::ty::Asyncness) -> rustc_middle::ty::Asyncness {
        value
    }
}trivial_encode_from! {
228    bool,
229    u64,
230    // tidy-alphabetical-start
231    crate::rmeta::AttrFlags,
232    crate::rmeta::remapped_def_id::RemappedRawDefId,
233    rustc_hir::Constness,
234    rustc_hir::CoroutineKind,
235    rustc_hir::Defaultness,
236    rustc_hir::Safety,
237    rustc_hir::def::DefKind,
238    rustc_middle::ty::Asyncness,
239    // tidy-alphabetical-end
240}
241
242impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<(rustc_middle::mir::ConstValue, Ty<'static>)> where
    B: std::borrow::Borrow<<(rustc_middle::mir::ConstValue, Ty<'static>) as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<(rustc_middle::mir::ConstValue, Ty<'static>)> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<crate::rmeta::VariantData>
    where
    B: std::borrow::Borrow<<crate::rmeta::VariantData as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<crate::rmeta::VariantData> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_abi::ReprOptions> where
    B: std::borrow::Borrow<<rustc_abi::ReprOptions as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_abi::ReprOptions> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_ast::DelimArgs> where
    B: std::borrow::Borrow<<rustc_ast::DelimArgs as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_ast::DelimArgs> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_attr_ir::ConstStability>
    where
    B: std::borrow::Borrow<<rustc_attr_ir::ConstStability as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_attr_ir::ConstStability> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_attr_ir::DefaultBodyStability> where
    B: std::borrow::Borrow<<rustc_attr_ir::DefaultBodyStability as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_attr_ir::DefaultBodyStability> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_attr_ir::Deprecation>
    where
    B: std::borrow::Borrow<<rustc_attr_ir::Deprecation as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_attr_ir::Deprecation> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_attr_ir::Stability>
    where
    B: std::borrow::Borrow<<rustc_attr_ir::Stability as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_attr_ir::Stability> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_hir::OpaqueTyOrigin<rustc_span::def_id::DefId>> where
    B: std::borrow::Borrow<<rustc_hir::OpaqueTyOrigin<rustc_span::def_id::DefId>
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_hir::OpaqueTyOrigin<rustc_span::def_id::DefId>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_hir::def_id::DefId>
    where
    B: std::borrow::Borrow<<rustc_hir::def_id::DefId as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_hir::def_id::DefId> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_hir::def_id::DefIdMap<rustc_middle::ty::EarlyBinder<'static,
    Ty<'static>>>> where
    B: std::borrow::Borrow<<rustc_hir::def_id::DefIdMap<rustc_middle::ty::EarlyBinder<'static,
    Ty<'static>>> as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_hir::def_id::DefIdMap<rustc_middle::ty::EarlyBinder<'static,
            Ty<'static>>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_hir::def_id::DefIdMap<std::vec::Vec<rustc_hir::def_id::DefId>>>
    where
    B: std::borrow::Borrow<<rustc_hir::def_id::DefIdMap<std::vec::Vec<rustc_hir::def_id::DefId>>
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_hir::def_id::DefIdMap<std::vec::Vec<rustc_hir::def_id::DefId>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_hir::definitions::DefKey> where
    B: std::borrow::Borrow<<rustc_hir::definitions::DefKey as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_hir::definitions::DefKey> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_index::IndexVec<rustc_abi::FieldIdx, rustc_span::Symbol>>
    where
    B: std::borrow::Borrow<<rustc_index::IndexVec<rustc_abi::FieldIdx,
    rustc_span::Symbol> as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_index::IndexVec<rustc_abi::FieldIdx,
            rustc_span::Symbol>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_index::IndexVec<rustc_middle::mir::Promoted,
    rustc_middle::mir::Body<'static>>> where
    B: std::borrow::Borrow<<rustc_index::IndexVec<rustc_middle::mir::Promoted,
    rustc_middle::mir::Body<'static>> as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_index::IndexVec<rustc_middle::mir::Promoted,
            rustc_middle::mir::Body<'static>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_index::bit_set::DenseBitSet<u32>> where
    B: std::borrow::Borrow<<rustc_index::bit_set::DenseBitSet<u32> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_index::bit_set::DenseBitSet<u32>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs> where
    B: std::borrow::Borrow<<rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::middle::resolve::DocLinkResMap> where
    B: std::borrow::Borrow<<rustc_middle::middle::resolve::DocLinkResMap as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::middle::resolve::DocLinkResMap> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault>
    where
    B: std::borrow::Borrow<<rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::mir::Body<'static>> where
    B: std::borrow::Borrow<<rustc_middle::mir::Body<'static> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::mir::Body<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::mir::ConstQualifs> where
    B: std::borrow::Borrow<<rustc_middle::mir::ConstQualifs as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::mir::ConstQualifs> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::mir::CoroutineLayout<'static>> where
    B: std::borrow::Borrow<<rustc_middle::mir::CoroutineLayout<'static> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::mir::CoroutineLayout<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::mir::interpret::ConstAllocation<'static>> where
    B: std::borrow::Borrow<<rustc_middle::mir::interpret::ConstAllocation<'static>
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::mir::interpret::ConstAllocation<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::AnonConstKind> where
    B: std::borrow::Borrow<<rustc_middle::ty::AnonConstKind as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::AnonConstKind> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::AssocContainer> where
    B: std::borrow::Borrow<<rustc_middle::ty::AssocContainer as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::AssocContainer> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::AsyncDestructor> where
    B: std::borrow::Borrow<<rustc_middle::ty::AsyncDestructor as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::AsyncDestructor> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::ConstConditions<'static>> where
    B: std::borrow::Borrow<<rustc_middle::ty::ConstConditions<'static> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::ConstConditions<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_middle::ty::Destructor>
    where
    B: std::borrow::Borrow<<rustc_middle::ty::Destructor as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::Destructor> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::EarlyBinder<'static, Ty<'static>>> where
    B: std::borrow::Borrow<<rustc_middle::ty::EarlyBinder<'static,
    Ty<'static>> as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::EarlyBinder<'static, Ty<'static>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::Const<'static>>> where
    B: std::borrow::Borrow<<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::Const<'static>> as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_middle::ty::EarlyBinder<'static,
            rustc_middle::ty::Const<'static>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::PolyFnSig<'static>>> where
    B: std::borrow::Borrow<<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::PolyFnSig<'static>> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_middle::ty::EarlyBinder<'static,
            rustc_middle::ty::PolyFnSig<'static>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::GenericClauses<'static>> where
    B: std::borrow::Borrow<<rustc_middle::ty::GenericClauses<'static> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::GenericClauses<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_middle::ty::Generics>
    where
    B: std::borrow::Borrow<<rustc_middle::ty::Generics as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::Generics> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::ImplTraitHeader<'static>> where
    B: std::borrow::Borrow<<rustc_middle::ty::ImplTraitHeader<'static> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::ImplTraitHeader<'static>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::ImplTraitInTraitData> where
    B: std::borrow::Borrow<<rustc_middle::ty::ImplTraitInTraitData as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::ImplTraitInTraitData> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::IntrinsicDef> where
    B: std::borrow::Borrow<<rustc_middle::ty::IntrinsicDef as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::IntrinsicDef> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::RestrictionKind> where
    B: std::borrow::Borrow<<rustc_middle::ty::RestrictionKind as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::RestrictionKind> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::Visibility<rustc_span::def_id::LocalDefId>>
    where
    B: std::borrow::Borrow<<rustc_middle::ty::Visibility<rustc_span::def_id::LocalDefId>
    as ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<rustc_middle::ty::Visibility<rustc_span::def_id::LocalDefId>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::adjustment::CoerceUnsizedInfo> where
    B: std::borrow::Borrow<<rustc_middle::ty::adjustment::CoerceUnsizedInfo as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::adjustment::CoerceUnsizedInfo> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<rustc_middle::ty::trait_def::TraitDef> where
    B: std::borrow::Borrow<<rustc_middle::ty::trait_def::TraitDef as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_middle::ty::trait_def::TraitDef> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_span::ExpnId> where
    B: std::borrow::Borrow<<rustc_span::ExpnId as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_span::ExpnId> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<rustc_span::Span> where
    B: std::borrow::Borrow<<rustc_span::Span as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<rustc_span::Span> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<std::option::Option<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::Const<'static>>>> where
    B: std::borrow::Borrow<<std::option::Option<rustc_middle::ty::EarlyBinder<'static,
    rustc_middle::ty::Const<'static>>> as ParameterizedOverTcx>::Value<'tcx>>
    {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<std::option::Option<rustc_middle::ty::EarlyBinder<'static,
            rustc_middle::ty::Const<'static>>>> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for LazyValue<std::string::String> where
    B: std::borrow::Borrow<<std::string::String as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        -> LazyValue<std::string::String> {
        encoder.lazy(value)
    }
}
impl<'tcx, B> EncodeFrom<'tcx, B> for
    LazyValue<std::vec::Vec<(usize, rustc_index::bit_set::DenseBitSet<u32>)>>
    where
    B: std::borrow::Borrow<<std::vec::Vec<(usize,
    rustc_index::bit_set::DenseBitSet<u32>)> as
    ParameterizedOverTcx>::Value<'tcx>> {
    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, value: B)
        ->
            LazyValue<std::vec::Vec<(usize,
            rustc_index::bit_set::DenseBitSet<u32>)>> {
        encoder.lazy(value)
    }
}lazy_encode_from! {
243    // tidy-alphabetical-start
244    (rustc_middle::mir::ConstValue, Ty<'static>),
245    crate::rmeta::VariantData,
246    rustc_abi::ReprOptions,
247    rustc_ast::DelimArgs,
248    rustc_attr_ir::ConstStability,
249    rustc_attr_ir::DefaultBodyStability,
250    rustc_attr_ir::Deprecation,
251    rustc_attr_ir::Stability,
252    rustc_hir::OpaqueTyOrigin<rustc_span::def_id::DefId>,
253    rustc_hir::def_id::DefId,
254    rustc_hir::def_id::DefIdMap<rustc_middle::ty::EarlyBinder<'static, Ty<'static>>>,
255    rustc_hir::def_id::DefIdMap<std::vec::Vec<rustc_hir::def_id::DefId>>,
256    rustc_hir::definitions::DefKey,
257    rustc_index::IndexVec<rustc_abi::FieldIdx, rustc_span::Symbol>,
258    rustc_index::IndexVec<rustc_middle::mir::Promoted, rustc_middle::mir::Body<'static>>,
259    rustc_index::bit_set::DenseBitSet<u32>,
260    rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs,
261    rustc_middle::middle::resolve::DocLinkResMap,
262    rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault,
263    rustc_middle::mir::Body<'static>,
264    rustc_middle::mir::ConstQualifs,
265    rustc_middle::mir::CoroutineLayout<'static>,
266    rustc_middle::mir::interpret::ConstAllocation<'static>,
267    rustc_middle::ty::AnonConstKind,
268    rustc_middle::ty::AssocContainer,
269    rustc_middle::ty::AsyncDestructor,
270    rustc_middle::ty::ConstConditions<'static>,
271    rustc_middle::ty::Destructor,
272    rustc_middle::ty::EarlyBinder<'static, Ty<'static>>,
273    rustc_middle::ty::EarlyBinder<'static, rustc_middle::ty::Const<'static>>,
274    rustc_middle::ty::EarlyBinder<'static, rustc_middle::ty::PolyFnSig<'static>>,
275    rustc_middle::ty::GenericClauses<'static>,
276    rustc_middle::ty::Generics,
277    rustc_middle::ty::ImplTraitHeader<'static>,
278    rustc_middle::ty::ImplTraitInTraitData,
279    rustc_middle::ty::IntrinsicDef,
280    rustc_middle::ty::RestrictionKind,
281    rustc_middle::ty::Visibility<rustc_span::def_id::LocalDefId>,
282    rustc_middle::ty::adjustment::CoerceUnsizedInfo,
283    rustc_middle::ty::trait_def::TraitDef,
284    rustc_span::ExpnId,
285    rustc_span::Span,
286    std::option::Option<rustc_middle::ty::EarlyBinder<'static, rustc_middle::ty::Const<'static>>>,
287    std::string::String,
288    std::vec::Vec<(usize, rustc_index::bit_set::DenseBitSet<u32>)>,
289    // tidy-alphabetical-end
290}
291
292impl<'tcx, T, B> EncodeFrom<'tcx, Option<B>> for Option<LazyValue<T>>
293where
294    T: ParameterizedOverTcx,
295    T::Value<'tcx>: for<'b> Encodable<EncodeContext<'b, 'tcx>>,
296    B: std::borrow::Borrow<T::Value<'tcx>>,
297{
298    fn encode_from<'a>(
299        encoder: &mut EncodeContext<'a, 'tcx>,
300        value: Option<B>,
301    ) -> Option<LazyValue<T>> {
302        value.map(|v| encoder.lazy(v))
303    }
304}
305
306impl<'tcx, T, I, B> EncodeFrom<'tcx, I> for LazyArray<T>
307where
308    T: ParameterizedOverTcx,
309    I: IntoIterator<Item = B>,
310    B: std::borrow::Borrow<T::Value<'tcx>>,
311    T::Value<'tcx>: for<'a> Encodable<EncodeContext<'a, 'tcx>>,
312{
313    fn encode_from<'a>(encoder: &mut EncodeContext<'a, 'tcx>, values: I) -> Self {
314        encoder.lazy_array(values)
315    }
316}