pub(crate) enum ImplSource<'db, N> {
UserDefined(ImplSourceUserDefinedData<'db, N>),
Param(Vec<N>),
Builtin(BuiltinImplSource, Vec<N>),
}Expand description
Given the successful resolution of an obligation, the ImplSource
indicates where the impl comes from.
For example, the obligation may be satisfied by a specific impl (case A), or it may be relative to some bound that is in scope (case B).
ⓘ
impl<T:Clone> Clone<T> for Option<T> { ... } // Impl_1
impl<T:Clone> Clone<T> for Box<T> { ... } // Impl_2
impl Clone for i32 { ... } // Impl_3
fn foo<T: Clone>(concrete: Option<Box<i32>>, param: T, mixed: Option<T>) {
// Case A: ImplSource points at a specific impl. Only possible when
// type is concretely known. If the impl itself has bounded
// type parameters, ImplSource will carry resolutions for those as well:
concrete.clone(); // ImplSource(Impl_1, [ImplSource(Impl_2, [ImplSource(Impl_3)])])
// Case B: ImplSource must be provided by caller. This applies when
// type is a type parameter.
param.clone(); // ImplSource::Param
// Case C: A mix of cases A and B.
mixed.clone(); // ImplSource(Impl_1, [ImplSource::Param])
}§The type parameter N
See explanation on ImplSourceUserDefinedData.
Variants§
UserDefined(ImplSourceUserDefinedData<'db, N>)
ImplSource identifying a particular impl.
Param(Vec<N>)
Successful resolution to an obligation provided by the caller
for some type parameter. The Vec<N> represents the
obligations incurred from normalizing the where-clause (if
any).
Builtin(BuiltinImplSource, Vec<N>)
Successful resolution for a builtin impl.
Implementations§
Source§impl<'db, N> ImplSource<'db, N>
impl<'db, N> ImplSource<'db, N>
pub(crate) fn nested_obligations(self) -> Vec<N>
pub(crate) fn borrow_nested_obligations(&self) -> &[N]
pub(crate) fn borrow_nested_obligations_mut(&mut self) -> &mut [N]
pub(crate) fn map<M, F>(self, f: F) -> ImplSource<'db, M>where
F: FnMut(N) -> M,
Trait Implementations§
Source§impl<'db, N: Clone> Clone for ImplSource<'db, N>
impl<'db, N: Clone> Clone for ImplSource<'db, N>
Source§fn clone(&self) -> ImplSource<'db, N>
fn clone(&self) -> ImplSource<'db, N>
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl<'db, N: Debug> Debug for ImplSource<'db, N>
impl<'db, N: Debug> Debug for ImplSource<'db, N>
Source§impl<'db, N: Hash> Hash for ImplSource<'db, N>
impl<'db, N: Hash> Hash for ImplSource<'db, N>
Source§impl<'db, N: PartialEq> PartialEq for ImplSource<'db, N>
impl<'db, N: PartialEq> PartialEq for ImplSource<'db, N>
Source§fn eq(&self, other: &ImplSource<'db, N>) -> bool
fn eq(&self, other: &ImplSource<'db, N>) -> bool
Tests for
self and other values to be equal, and is used by ==.Source§impl<'db, N> TypeFoldable<DbInterner<'db>> for ImplSource<'db, N>where
N: TypeFoldable<DbInterner<'db>>,
impl<'db, N> TypeFoldable<DbInterner<'db>> for ImplSource<'db, N>where
N: TypeFoldable<DbInterner<'db>>,
Source§fn try_fold_with<__F: FallibleTypeFolder<DbInterner<'db>>>(
self,
__folder: &mut __F,
) -> Result<Self, __F::Error>
fn try_fold_with<__F: FallibleTypeFolder<DbInterner<'db>>>( self, __folder: &mut __F, ) -> Result<Self, __F::Error>
Source§impl<'db, N> TypeVisitable<DbInterner<'db>> for ImplSource<'db, N>where
N: TypeVisitable<DbInterner<'db>>,
impl<'db, N> TypeVisitable<DbInterner<'db>> for ImplSource<'db, N>where
N: TypeVisitable<DbInterner<'db>>,
Source§fn visit_with<__V: TypeVisitor<DbInterner<'db>>>(
&self,
__visitor: &mut __V,
) -> __V::Result
fn visit_with<__V: TypeVisitor<DbInterner<'db>>>( &self, __visitor: &mut __V, ) -> __V::Result
impl<'db, N: Eq> Eq for ImplSource<'db, N>
impl<'db, N> StructuralPartialEq for ImplSource<'db, N>
Auto Trait Implementations§
impl<'db, N> Freeze for ImplSource<'db, N>
impl<'db, N> RefUnwindSafe for ImplSource<'db, N>where
N: RefUnwindSafe,
impl<'db, N> Send for ImplSource<'db, N>where
N: Send,
impl<'db, N> Sync for ImplSource<'db, N>where
N: Sync,
impl<'db, N> Unpin for ImplSource<'db, N>where
N: Unpin,
impl<'db, N> UnsafeUnpin for ImplSource<'db, N>
impl<'db, N> UnwindSafe for ImplSource<'db, N>where
N: UnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more
§impl<T> HashEqLike<T> for T
impl<T> HashEqLike<T> for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Lookup<T> for T
impl<T> Lookup<T> for T
fn into_owned(self) -> T
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> TypeVisitableExt<I> for Twhere
I: Interner,
T: TypeVisitable<I>,
impl<I, T> TypeVisitableExt<I> for Twhere
I: Interner,
T: TypeVisitable<I>,
fn has_type_flags(&self, flags: TypeFlags) -> bool
§fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool
fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool
Returns
true if self has any late-bound regions that are either
bound by binder or bound by some binder outside of binder.
If binder is ty::INNERMOST, this indicates whether
there are any late-bound regions that appear free.fn error_reported(&self) -> Result<(), <I as Interner>::ErrorGuaranteed>
fn non_region_error_reported( &self, ) -> Result<(), <I as Interner>::ErrorGuaranteed>
§fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool
fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool
Returns
true if this type has any regions that escape binder (and
hence are not bound by it).§fn has_escaping_bound_vars(&self) -> bool
fn has_escaping_bound_vars(&self) -> bool
Returns
true if this type has regions that are not a part of the
type. For example, given a for<'a> fn(&'a i32) this function returns
false, while given a fn(&'a i32) it returns true. The latter can
occur when traversing through the former. Read morefn has_aliases(&self) -> bool
fn has_opaque_types(&self) -> bool
fn has_coroutines(&self) -> bool
fn references_error(&self) -> bool
fn has_non_region_param(&self) -> bool
fn has_regions(&self) -> bool
fn has_infer_regions(&self) -> bool
fn has_infer_types(&self) -> bool
fn has_non_region_infer(&self) -> bool
fn has_infer(&self) -> bool
fn has_placeholders(&self) -> bool
fn has_non_region_placeholders(&self) -> bool
fn has_param(&self) -> bool
§fn has_free_regions(&self) -> bool
fn has_free_regions(&self) -> bool
“Free” regions in this context means that it has any region
that is not (a) erased or (b) late-bound.
fn has_erased_regions(&self) -> bool
§fn has_erasable_regions(&self) -> bool
fn has_erasable_regions(&self) -> bool
True if there are any un-erased free regions.
§fn is_global(&self) -> bool
fn is_global(&self) -> bool
Indicates whether this value references only ‘global’
generic parameters that are the same regardless of what fn we are
in. This is used for caching.
§fn has_bound_regions(&self) -> bool
fn has_bound_regions(&self) -> bool
True if there are any late-bound regions
§fn has_non_region_bound_vars(&self) -> bool
fn has_non_region_bound_vars(&self) -> bool
True if there are any late-bound non-region variables
§fn has_bound_vars(&self) -> bool
fn has_bound_vars(&self) -> bool
True if there are any bound variables
§fn still_further_specializable(&self) -> bool
fn still_further_specializable(&self) -> bool
Indicates whether this value still has parameters/placeholders/inference variables
which could be replaced later, in a way that would change the results of
impl
specialization.§fn has_non_region_error(&self) -> bool
fn has_non_region_error(&self) -> bool
True if a type or const error is reachable