use std::hash::Hash; use rustc_data_structures::unord::UnordMap; use rustc_hir::def_id::DefIndex; use rustc_index::{Idx, IndexVec}; use rustc_span::Symbol; use crate::ty; pub trait ParameterizedOverTcx: 'static { type Value<'tcx>; } impl ParameterizedOverTcx for &'static [T] { type Value<'tcx> = &'tcx [T::Value<'tcx>]; } impl ParameterizedOverTcx for Option { type Value<'tcx> = Option>; } impl ParameterizedOverTcx for (A, B) { type Value<'tcx> = (A::Value<'tcx>, B::Value<'tcx>); } impl ParameterizedOverTcx for IndexVec { type Value<'tcx> = IndexVec>; } impl ParameterizedOverTcx for UnordMap { type Value<'tcx> = UnordMap>; } impl ParameterizedOverTcx for ty::Binder<'static, T> { type Value<'tcx> = ty::Binder<'tcx, T::Value<'tcx>>; } impl ParameterizedOverTcx for ty::EarlyBinder<'static, T> { type Value<'tcx> = ty::EarlyBinder<'tcx, T::Value<'tcx>>; } #[macro_export] macro_rules! trivially_parameterized_over_tcx { ($($ty:ty),+ $(,)?) => { $( impl $crate::ty::ParameterizedOverTcx for $ty { #[allow(unused_lifetimes)] type Value<'tcx> = $ty; } )* } } trivially_parameterized_over_tcx! { usize, (), u32, u64, bool, std::string::String, crate::metadata::ModChild, crate::middle::codegen_fn_attrs::CodegenFnAttrs, crate::middle::debugger_visualizer::DebuggerVisualizerFile, crate::middle::exported_symbols::SymbolExportInfo, crate::middle::lib_features::FeatureStability, crate::middle::resolve_bound_vars::ObjectLifetimeDefault, crate::mir::ConstQualifs, ty::AsyncDestructor, ty::AssocItemContainer, ty::Asyncness, ty::AnonConstKind, ty::DeducedParamAttrs, ty::Destructor, ty::Generics, ty::ImplPolarity, ty::ImplTraitInTraitData, ty::ReprOptions, ty::TraitDef, ty::UnusedGenericParams, ty::Visibility, ty::adjustment::CoerceUnsizedInfo, ty::fast_reject::SimplifiedType, ty::IntrinsicDef, rustc_ast::Attribute, rustc_ast::DelimArgs, rustc_ast::expand::StrippedCfgItem, rustc_attr_data_structures::ConstStability, rustc_attr_data_structures::DefaultBodyStability, rustc_attr_data_structures::Deprecation, rustc_attr_data_structures::Stability, rustc_hir::Constness, rustc_hir::Defaultness, rustc_hir::Safety, rustc_hir::CoroutineKind, rustc_hir::IsAsync, rustc_hir::LangItem, rustc_hir::def::DefKind, rustc_hir::def::DocLinkResMap, rustc_hir::def_id::DefId, rustc_hir::def_id::DefIndex, rustc_hir::definitions::DefKey, rustc_hir::OpaqueTyOrigin, rustc_hir::PreciseCapturingArgKind, rustc_index::bit_set::DenseBitSet, rustc_index::bit_set::FiniteBitSet, rustc_session::cstore::ForeignModule, rustc_session::cstore::LinkagePreference, rustc_session::cstore::NativeLib, rustc_session::config::TargetModifier, rustc_span::ExpnData, rustc_span::ExpnHash, rustc_span::ExpnId, rustc_span::SourceFile, rustc_span::Span, rustc_span::Symbol, rustc_span::def_id::DefPathHash, rustc_span::hygiene::SyntaxContextKey, rustc_span::Ident, rustc_type_ir::Variance, rustc_hir::Attribute, } // HACK(compiler-errors): This macro rule can only take a fake path, // not a real, due to parsing ambiguity reasons. #[macro_export] macro_rules! parameterized_over_tcx { ($($($fake_path:ident)::+),+ $(,)?) => { $( impl $crate::ty::ParameterizedOverTcx for $($fake_path)::+<'static> { type Value<'tcx> = $($fake_path)::+<'tcx>; } )* } } parameterized_over_tcx! { crate::middle::exported_symbols::ExportedSymbol, crate::mir::Body, crate::mir::CoroutineLayout, crate::mir::interpret::ConstAllocation, ty::Ty, ty::FnSig, ty::GenericPredicates, ty::ConstConditions, ty::TraitRef, ty::Const, ty::Predicate, ty::Clause, ty::ClauseKind, ty::ImplTraitHeader, }