pub enum TraitRefKind {
TraitImpl(TraitImplRef),
Clause(ClauseDbVar),
ParentClause(Box<TraitRef>, TraitClauseId),
ItemClause(Box<TraitRef>, TraitItemName, TraitClauseId),
SelfId,
BuiltinOrAuto {
parent_trait_refs: Vector<TraitClauseId, TraitRef>,
types: Vec<(TraitItemName, TraitAssocTyImpl)>,
},
Dyn,
Unknown(String),
}Expand description
Identifier of a trait instance. This is derived from the trait resolution.
Should be read as a path inside the trait clauses which apply to the current
definition. Note that every path designated by TraitInstanceId refers
to a trait instance, which is why the TraitRefKind::Clause variant may seem redundant
with some of the other variants.
Variants§
TraitImpl(TraitImplRef)
A specific top-level implementation item.
Clause(ClauseDbVar)
One of the local clauses.
Example:
fn f<T>(...) where T : Foo
^^^^^^^
Clause(0)ParentClause(Box<TraitRef>, TraitClauseId)
A parent clause
Example:
trait Foo1 {}
trait Foo2 { fn f(); }
trait Bar : Foo1 + Foo2 {}
^^^^ ^^^^
parent clause 1
parent clause 0
fn g<T : Bar>(x : T) {
x.f()
^^^^^
Parent(Clause(0), 1)::f(x)
^
parent clause 1 of clause 0
}ItemClause(Box<TraitRef>, TraitItemName, TraitClauseId)
A clause defined on an associated type. This variant is only used during translation; after
the lift_associated_item_clauses pass, clauses on items become ParentClauses.
Example:
trait Foo {
type W: Bar0 + Bar1 // Bar1 contains a method bar1
^^^^
this is the clause 1 applying to W
}
fn f<T : Foo>(x : T::W) {
x.bar1();
^^^^^^^
ItemClause(Clause(0), W, 1)
^^^^
clause 1 from item W (from local clause 0)
}SelfId
The implicit Self: Trait clause. Present inside trait declarations, including trait
method declarations. Not present in trait implementations as we can use TraitImpl intead.
BuiltinOrAuto
A trait implementation that is computed by the compiler, such as for built-in trait
Sized. This morally points to an invisible impl block; as such it contains
the information we may need from one.
Fields
parent_trait_refs: Vector<TraitClauseId, TraitRef>Exactly like the same field on TraitImpl: the TraitRefs required to satisfy the
implied predicates on the trait declaration. E.g. since FnMut: FnOnce, a built-in T: FnMut impl would have a TraitRef for T: FnOnce.
types: Vec<(TraitItemName, TraitAssocTyImpl)>The values of the associated types for this trait.
Dyn
The automatically-generated implementation for dyn Trait.
Unknown(String)
For error reporting.
Implementations§
Source§impl TraitRefKind
impl TraitRefKind
pub fn to_path(&self) -> Option<TraitRefPath>
Trait Implementations§
Source§impl AstVisitable for TraitRefKind
impl AstVisitable for TraitRefKind
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
self, in pre-order traversal.Source§impl Clone for TraitRefKind
impl Clone for TraitRefKind
Source§fn clone(&self) -> TraitRefKind
fn clone(&self) -> TraitRefKind
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TraitRefKind
impl Debug for TraitRefKind
Source§impl<'de> Deserialize<'de> for TraitRefKind
impl<'de> Deserialize<'de> for TraitRefKind
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for TraitRefKindwhere
V: Visitor + Visit<'s, TraitImplRef> + Visit<'s, ClauseDbVar> + Visit<'s, Box<TraitRef>> + Visit<'s, TraitClauseId> + Visit<'s, TraitItemName> + Visit<'s, Vector<TraitClauseId, TraitRef>> + Visit<'s, Vec<(TraitItemName, TraitAssocTyImpl)>>,
impl<'s, V> Drive<'s, V> for TraitRefKindwhere
V: Visitor + Visit<'s, TraitImplRef> + Visit<'s, ClauseDbVar> + Visit<'s, Box<TraitRef>> + Visit<'s, TraitClauseId> + Visit<'s, TraitItemName> + Visit<'s, Vector<TraitClauseId, TraitRef>> + Visit<'s, Vec<(TraitItemName, TraitAssocTyImpl)>>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for TraitRefKindwhere
V: Visitor + VisitMut<'s, TraitImplRef> + VisitMut<'s, ClauseDbVar> + VisitMut<'s, Box<TraitRef>> + VisitMut<'s, TraitClauseId> + VisitMut<'s, TraitItemName> + VisitMut<'s, Vector<TraitClauseId, TraitRef>> + VisitMut<'s, Vec<(TraitItemName, TraitAssocTyImpl)>>,
impl<'s, V> DriveMut<'s, V> for TraitRefKindwhere
V: Visitor + VisitMut<'s, TraitImplRef> + VisitMut<'s, ClauseDbVar> + VisitMut<'s, Box<TraitRef>> + VisitMut<'s, TraitClauseId> + VisitMut<'s, TraitItemName> + VisitMut<'s, Vector<TraitClauseId, TraitRef>> + VisitMut<'s, Vec<(TraitItemName, TraitAssocTyImpl)>>,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl From<DeBruijnVar<TraitClauseId>> for TraitRefKind
impl From<DeBruijnVar<TraitClauseId>> for TraitRefKind
Source§fn from(x: ClauseDbVar) -> Self
fn from(x: ClauseDbVar) -> Self
Source§impl Hash for TraitRefKind
impl Hash for TraitRefKind
Source§impl PartialEq for TraitRefKind
impl PartialEq for TraitRefKind
Source§impl Serialize for TraitRefKind
impl Serialize for TraitRefKind
Source§impl TryFrom<TraitRefKind> for ClauseDbVar
impl TryFrom<TraitRefKind> for ClauseDbVar
impl Eq for TraitRefKind
impl StructuralPartialEq for TraitRefKind
Auto Trait Implementations§
impl Freeze for TraitRefKind
impl RefUnwindSafe for TraitRefKind
impl Send for TraitRefKind
impl Sync for TraitRefKind
impl Unpin for TraitRefKind
impl UnwindSafe for TraitRefKind
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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
§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
key and return true if they are equal.§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
§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>
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>
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<I> RecreateContext<I> for I
impl<I> RecreateContext<I> for I
§fn recreate_context(_original_input: I, tail: I) -> I
fn recreate_context(_original_input: I, tail: I) -> I
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen De Bruijn indices
will count from the outside of self.Source§fn substitute(self, generics: &GenericArgs) -> Self
fn substitute(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you most likely want to use
substitute_with_self.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
TraitRefKind::Self trait ref.Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth binders. Returns None if it contains a variable bound in
one of these depth binders.Source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen indices will count
from the outside of self.