pub(super) struct Canonicalizer<'a, D: SolverDelegate<Interner = I>, I: Interner> {
delegate: &'a D,
canonicalize_mode: CanonicalizeMode,
state: CanonicalizerState<I>,
}Fields§
§delegate: &'a D§canonicalize_mode: CanonicalizeMode§state: CanonicalizerState<I>Implementations§
Source§impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I>
impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I>
fn new(delegate: &'a D, canonicalize_mode: CanonicalizeMode) -> Self
pub(super) fn canonicalize_response<T: TypeFoldable<I>>( delegate: &'a D, max_input_universe: UniverseIndex, value: T, ) -> Canonical<I, T>
fn canonicalize_param_env( delegate: &'a D, param_env: I::ParamEnv, ) -> (I::ParamEnv, Self)
Sourcepub(super) fn canonicalize_input<P: TypeFoldable<I>>(
delegate: &'a D,
input: QueryInput<I, P>,
) -> (ThinVec<I::GenericArg>, Canonical<I, QueryInput<I, P>>)
pub(super) fn canonicalize_input<P: TypeFoldable<I>>( delegate: &'a D, input: QueryInput<I, P>, ) -> (ThinVec<I::GenericArg>, Canonical<I, QueryInput<I, P>>)
When canonicalizing query inputs, we keep 'static in the param_env
but erase it everywhere else. We generally don’t want to depend on region
identity, so while it should not matter whether 'static is kept in the
value or opaque type storage as well, this prevents us from accidentally
relying on it in the future.
We want to keep the option of canonicalizing 'static to an existential
variable in the future by changing the way we detect global where-bounds.
fn get_or_insert_bound_var( &mut self, arg: impl Into<I::GenericArg>, kind: CanonicalVarKind<I>, ) -> BoundVar
fn get_or_insert_sub_root(&mut self, vid: TyVid) -> BoundVar
fn finalize( self, ) -> (UniverseIndex, ThinVec<I::GenericArg>, I::CanonicalVarKinds)
fn inner_fold_ty(&mut self, t: I::Ty) -> I::Ty
Trait Implementations§
Source§impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for Canonicalizer<'_, D, I>
impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for Canonicalizer<'_, D, I>
fn cx(&self) -> I
fn fold_region(&mut self, r: Region<I>) -> Region<I>
fn fold_ty(&mut self, t: I::Ty) -> I::Ty
fn fold_const(&mut self, c: I::Const) -> I::Const
fn fold_predicate(&mut self, p: I::Predicate) -> I::Predicate
fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses
fn fold_binder<T>(&mut self, t: Binder<I, T>) -> Binder<I, T>where
T: TypeFoldable<I>,
Auto Trait Implementations§
impl<'a, D, I> DynSend for Canonicalizer<'a, D, I>
impl<'a, D, I> DynSync for Canonicalizer<'a, D, I>
impl<'a, D, I> Freeze for Canonicalizer<'a, D, I>
impl<'a, D, I> RefUnwindSafe for Canonicalizer<'a, D, I>
impl<'a, D, I> Send for Canonicalizer<'a, D, I>
impl<'a, D, I> Sync for Canonicalizer<'a, D, I>
impl<'a, D, I> Unpin for Canonicalizer<'a, D, I>
impl<'a, D, I> UnsafeUnpin for Canonicalizer<'a, D, I>
impl<'a, D, I> UnwindSafe for Canonicalizer<'a, D, I>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
Source§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 152 bytes