-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rustdoc-search: stress test for associated types
- Loading branch information
Showing
3 changed files
with
259 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,245 @@ | ||
#![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<Self> | ||
+ Hash | ||
+ Ord | ||
+ IntoIterator<Item = Self::GenericArg>; | ||
type GenericArg: Copy + DebugWithInfcx<Self> + Hash + Ord; | ||
type Term: Copy + Debug + Hash + Ord; | ||
type Binder<T: TypeVisitable<Self>>: BoundVars<Self> + TypeSuperVisitable<Self>; | ||
type BoundVars: IntoIterator<Item = Self::BoundVar>; | ||
type BoundVar; | ||
type CanonicalVars: Copy + Debug + Hash + Eq + IntoIterator<Item = CanonicalVarInfo<Self>>; | ||
type Ty: Copy | ||
+ DebugWithInfcx<Self> | ||
+ Hash | ||
+ Ord | ||
+ Into<Self::GenericArg> | ||
+ IntoKind<Kind = TyKind<Self>> | ||
+ TypeSuperVisitable<Self> | ||
+ Flags | ||
+ Ty<Self>; | ||
type Tys: Copy + Debug + Hash + Ord + IntoIterator<Item = Self::Ty>; | ||
type AliasTy: Copy + DebugWithInfcx<Self> + 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<Self> + Hash + Ord; | ||
type PolyFnSig: Copy + DebugWithInfcx<Self> + Hash + Ord; | ||
type AllocId: Copy + Debug + Hash + Ord; | ||
type Const: Copy | ||
+ DebugWithInfcx<Self> | ||
+ Hash | ||
+ Ord | ||
+ Into<Self::GenericArg> | ||
+ IntoKind<Kind = ConstKind<Self>> | ||
+ ConstTy<Self> | ||
+ TypeSuperVisitable<Self> | ||
+ Flags | ||
+ Const<Self>; | ||
type AliasConst: Copy + DebugWithInfcx<Self> + 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<Self> + Hash + Ord; | ||
type Region: Copy | ||
+ DebugWithInfcx<Self> | ||
+ Hash | ||
+ Ord | ||
+ Into<Self::GenericArg> | ||
+ IntoKind<Kind = RegionKind<Self>> | ||
+ Flags | ||
+ Region<Self>; | ||
type EarlyParamRegion: Copy + Debug + Hash + Ord; | ||
type LateParamRegion: Copy + Debug + Hash + Ord; | ||
type BoundRegion: Copy + Debug + Hash + Ord; | ||
type InferRegion: Copy + DebugWithInfcx<Self> + Hash + Ord; | ||
type PlaceholderRegion: Copy + Debug + Hash + Ord + PlaceholderLike; | ||
type Predicate: Copy + Debug + Hash + Eq + TypeSuperVisitable<Self> + 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>] | ||
) -> Self::CanonicalVars; | ||
} | ||
|
||
pub trait DebugWithInfcx<I: Interner>: Debug { | ||
// Required method | ||
fn fmt<Infcx: InferCtxtLike<Interner = I>>( | ||
this: WithInfcx<'_, Infcx, &Self>, | ||
f: &mut Formatter<'_> | ||
) -> std::fmt::Result; | ||
} | ||
|
||
pub trait TypeVisitable<I: Interner>: Debug + Clone { | ||
// Required method | ||
fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result; | ||
} | ||
|
||
pub trait BoundVars<I: Interner> { | ||
// Required methods | ||
fn bound_vars(&self) -> I::BoundVars; | ||
fn has_no_bound_vars(&self) -> bool; | ||
} | ||
|
||
pub trait TypeSuperVisitable<I: Interner>: TypeVisitable<I> { | ||
// Required method | ||
fn super_visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result; | ||
} | ||
|
||
pub struct CanonicalVarInfo<I: Interner> { | ||
pub kind: CanonicalVarKind<I>, | ||
} | ||
|
||
pub struct CanonicalVarKind<I>(std::marker::PhantomData<I>); | ||
|
||
pub struct TyKind<I>(std::marker::PhantomData<I>); | ||
|
||
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<I: Interner<Ty = Self>> { | ||
// 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<I>(std::marker::PhantomData<I>); | ||
pub trait Const<I: Interner<Const = Self>> { | ||
// Required method | ||
fn new_anon_bound( | ||
interner: I, | ||
debruijn: DebruijnIndex, | ||
var: BoundVar, | ||
ty: I::Ty | ||
) -> Self; | ||
} | ||
|
||
pub trait ConstTy<I: Interner> { | ||
// Required method | ||
fn ty(self) -> I::Ty; | ||
} | ||
|
||
pub struct DebruijnIndex; | ||
|
||
pub struct RegionKind<I>(std::marker::PhantomData<I>); | ||
pub trait Region<I: Interner<Region = Self>> { | ||
// Required method | ||
fn new_anon_bound( | ||
interner: I, | ||
debruijn: DebruijnIndex, | ||
var: BoundVar | ||
) -> Self; | ||
} | ||
|
||
pub trait TypeVisitor<I: Interner>: Sized { | ||
type Result: VisitorResult = (); | ||
|
||
// Provided methods | ||
fn visit_binder<T: TypeVisitable<I>>( | ||
&mut self, | ||
t: &I::Binder<T> | ||
) -> 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::Residual>) -> Self; | ||
fn branch(self) -> ControlFlow<Self::Residual>; | ||
} | ||
|
||
impl VisitorResult for () { | ||
type Residual = (); | ||
fn output() -> Self {} | ||
fn from_residual(_: Self::Residual) -> Self {} | ||
fn from_branch(_: ControlFlow<Self::Residual>) -> Self {} | ||
fn branch(self) -> ControlFlow<Self::Residual> { 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<UniverseIndex>; | ||
fn root_ty_var(&self, vid: TyVid) -> TyVid; | ||
fn probe_ty_var( | ||
&self, | ||
vid: TyVid | ||
) -> Option<<Self::Interner as Interner>::Ty>; | ||
fn universe_of_lt( | ||
&self, | ||
lt: <Self::Interner as Interner>::InferRegion | ||
) -> Option<UniverseIndex>; | ||
fn opportunistic_resolve_lt_var( | ||
&self, | ||
vid: <Self::Interner as Interner>::InferRegion | ||
) -> Option<<Self::Interner as Interner>::Region>; | ||
fn universe_of_ct(&self, ct: ConstVid) -> Option<UniverseIndex>; | ||
fn root_ct_var(&self, vid: ConstVid) -> ConstVid; | ||
fn probe_ct_var( | ||
&self, | ||
vid: ConstVid | ||
) -> Option<<Self::Interner as Interner>::Const>; | ||
} | ||
|
||
pub struct TyVid; | ||
pub struct ConstVid; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
// https://github.com/rust-lang/rust/pull/122247 | ||
// exact-check | ||
|
||
const EXPECTED = { | ||
'query': 'canonicalvarinfo, intoiterator -> intoiterator', | ||
'others': [ | ||
{ 'path': 'looks_like_rustc_interner::Interner', 'name': 'mk_canonical_var_infos' }, | ||
], | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
//@ aux-crate:interner=interner.rs | ||
// https://github.com/rust-lang/rust/pull/122247 | ||
extern crate interner; | ||
#[doc(inline)] | ||
pub use interner::*; |