#![feature(associated_type_defaults)] use std::cmp::Ord; use std::fmt::{Debug, Formatter}; use std::hash::Hash; use std::ops::ControlFlow; pub trait Interner: Sized { type DefId: Copy + Debug + Hash + Ord; type AdtDef: Copy + Debug + Hash + Ord; type GenericArgs: Copy + DebugWithInfcx + Hash + Ord + IntoIterator; type GenericArg: Copy + DebugWithInfcx + Hash + Ord; type Term: Copy + Debug + Hash + Ord; type Binder>: BoundVars + TypeSuperVisitable; type BoundVars: IntoIterator; type BoundVar; type CanonicalVars: Copy + Debug + Hash + Eq + IntoIterator>; type Ty: Copy + DebugWithInfcx + Hash + Ord + Into + IntoKind> + TypeSuperVisitable + Flags + Ty; type Tys: Copy + Debug + Hash + Ord + IntoIterator; type AliasTy: Copy + DebugWithInfcx + Hash + Ord; type ParamTy: Copy + Debug + Hash + Ord; type BoundTy: Copy + Debug + Hash + Ord; type PlaceholderTy: Copy + Debug + Hash + Ord + PlaceholderLike; type ErrorGuaranteed: Copy + Debug + Hash + Ord; type BoundExistentialPredicates: Copy + DebugWithInfcx + Hash + Ord; type PolyFnSig: Copy + DebugWithInfcx + Hash + Ord; type AllocId: Copy + Debug + Hash + Ord; type Const: Copy + DebugWithInfcx + Hash + Ord + Into + IntoKind> + ConstTy + TypeSuperVisitable + Flags + Const; type AliasConst: Copy + DebugWithInfcx + Hash + Ord; type PlaceholderConst: Copy + Debug + Hash + Ord + PlaceholderLike; type ParamConst: Copy + Debug + Hash + Ord; type BoundConst: Copy + Debug + Hash + Ord; type ValueConst: Copy + Debug + Hash + Ord; type ExprConst: Copy + DebugWithInfcx + Hash + Ord; type Region: Copy + DebugWithInfcx + Hash + Ord + Into + IntoKind> + Flags + Region; type EarlyParamRegion: Copy + Debug + Hash + Ord; type LateParamRegion: Copy + Debug + Hash + Ord; type BoundRegion: Copy + Debug + Hash + Ord; type InferRegion: Copy + DebugWithInfcx + Hash + Ord; type PlaceholderRegion: Copy + Debug + Hash + Ord + PlaceholderLike; type Predicate: Copy + Debug + Hash + Eq + TypeSuperVisitable + Flags; type TraitPredicate: Copy + Debug + Hash + Eq; type RegionOutlivesPredicate: Copy + Debug + Hash + Eq; type TypeOutlivesPredicate: Copy + Debug + Hash + Eq; type ProjectionPredicate: Copy + Debug + Hash + Eq; type NormalizesTo: Copy + Debug + Hash + Eq; type SubtypePredicate: Copy + Debug + Hash + Eq; type CoercePredicate: Copy + Debug + Hash + Eq; type ClosureKind: Copy + Debug + Hash + Eq; // Required method fn mk_canonical_var_infos( self, infos: &[CanonicalVarInfo] ) -> Self::CanonicalVars; } pub trait DebugWithInfcx: Debug { // Required method fn fmt>( this: WithInfcx<'_, Infcx, &Self>, f: &mut Formatter<'_> ) -> std::fmt::Result; } pub trait TypeVisitable: Debug + Clone { // Required method fn visit_with>(&self, visitor: &mut V) -> V::Result; } pub trait BoundVars { // Required methods fn bound_vars(&self) -> I::BoundVars; fn has_no_bound_vars(&self) -> bool; } pub trait TypeSuperVisitable: TypeVisitable { // Required method fn super_visit_with>(&self, visitor: &mut V) -> V::Result; } pub struct CanonicalVarInfo { pub kind: CanonicalVarKind, } pub struct CanonicalVarKind(std::marker::PhantomData); pub struct TyKind(std::marker::PhantomData); pub trait IntoKind { type Kind; // Required method fn kind(self) -> Self::Kind; } pub trait Flags { // Required methods fn flags(&self) -> TypeFlags; fn outer_exclusive_binder(&self) -> DebruijnIndex; } pub struct TypeFlags; pub trait Ty> { // Required method fn new_anon_bound( interner: I, debruijn: DebruijnIndex, var: BoundVar ) -> Self; } pub trait PlaceholderLike { // Required methods fn universe(self) -> UniverseIndex; fn var(self) -> BoundVar; fn with_updated_universe(self, ui: UniverseIndex) -> Self; fn new(ui: UniverseIndex, var: BoundVar) -> Self; } pub struct UniverseIndex; pub struct BoundVar; pub struct ConstKind(std::marker::PhantomData); pub trait Const> { // Required method fn new_anon_bound( interner: I, debruijn: DebruijnIndex, var: BoundVar, ty: I::Ty ) -> Self; } pub trait ConstTy { // Required method fn ty(self) -> I::Ty; } pub struct DebruijnIndex; pub struct RegionKind(std::marker::PhantomData); pub trait Region> { // Required method fn new_anon_bound( interner: I, debruijn: DebruijnIndex, var: BoundVar ) -> Self; } pub trait TypeVisitor: Sized { type Result: VisitorResult = (); // Provided methods fn visit_binder>( &mut self, t: &I::Binder ) -> Self::Result { unimplemented!() } fn visit_ty(&mut self, t: I::Ty) -> Self::Result { unimplemented!() } fn visit_region(&mut self, _r: I::Region) -> Self::Result { unimplemented!() } fn visit_const(&mut self, c: I::Const) -> Self::Result { unimplemented!() } fn visit_predicate(&mut self, p: I::Predicate) -> Self::Result { unimplemented!() } } pub trait VisitorResult { type Residual; // Required methods fn output() -> Self; fn from_residual(residual: Self::Residual) -> Self; fn from_branch(b: ControlFlow) -> Self; fn branch(self) -> ControlFlow; } impl VisitorResult for () { type Residual = (); fn output() -> Self {} fn from_residual(_: Self::Residual) -> Self {} fn from_branch(_: ControlFlow) -> Self {} fn branch(self) -> ControlFlow { ControlFlow::Continue(()) } } pub struct WithInfcx<'a, Infcx: InferCtxtLike, T> { pub data: T, pub infcx: &'a Infcx, } pub trait InferCtxtLike { type Interner: Interner; // Required methods fn interner(&self) -> Self::Interner; fn universe_of_ty(&self, ty: TyVid) -> Option; fn root_ty_var(&self, vid: TyVid) -> TyVid; fn probe_ty_var( &self, vid: TyVid ) -> Option<::Ty>; fn universe_of_lt( &self, lt: ::InferRegion ) -> Option; fn opportunistic_resolve_lt_var( &self, vid: ::InferRegion ) -> Option<::Region>; fn universe_of_ct(&self, ct: ConstVid) -> Option; fn root_ct_var(&self, vid: ConstVid) -> ConstVid; fn probe_ct_var( &self, vid: ConstVid ) -> Option<::Const>; } pub struct TyVid; pub struct ConstVid;