pub enum TraitRefKind {
TraitImpl(TraitImplId, GenericArgs),
Clause(ClauseDbVar),
ParentClause(Box<TraitRefKind>, TraitDeclId, TraitClauseId),
ItemClause(Box<TraitRefKind>, TraitDeclId, TraitItemName, TraitClauseId),
SelfId,
BuiltinOrAuto {
trait_decl_ref: PolyTraitDeclRef,
parent_trait_refs: Vector<TraitClauseId, TraitRef>,
types: Vec<(TraitItemName, Ty)>,
},
Dyn(PolyTraitDeclRef),
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 [Clause] variant may seem redundant with some of the other variants.
Variants§
TraitImpl(TraitImplId, GenericArgs)
A specific top-level implementation item.
Clause(ClauseDbVar)
One of the local clauses.
Example:
fn f<T>(...) where T : Foo
^^^^^^^
Clause(0)
ParentClause(Box<TraitRefKind>, TraitDeclId, TraitClauseId)
A parent clause
Remark: the TraitDeclId gives the trait declaration which is implemented by the instance id from which we take the parent clause (see example below). It is not necessary and included for convenience.
Remark: Ideally we should store a full TraitRef
instead, but hax does not give us enough
information to get the right generic args.
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), Bar, 1)::f(x)
^
parent clause 1 of clause 0
^^^
clause 0 implements Bar
}
ItemClause(Box<TraitRefKind>, TraitDeclId, 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 ParentClause
s.
Remark: the TraitDeclId gives the trait declaration which is implemented by the trait implementation from which we take the item (see below). It is not necessary and provided for convenience.
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), Foo, W, 1)
^^^^
clause 1 from item W (from local clause 0)
^^^
local clause 0 implements Foo
}
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 traits
Sized
or FnMut
. This morally points to an invisible impl
block; as such it contains
the information we may need from one.
Fields
trait_decl_ref: PolyTraitDeclRef
parent_trait_refs: Vector<TraitClauseId, TraitRef>
The ImplExpr
s required to satisfy the implied predicates on the trait declaration.
E.g. since FnMut: FnOnce
, a built-in T: FnMut
impl would have an ImplExpr
for T: FnOnce
.
types: Vec<(TraitItemName, Ty)>
The values of the associated types for this trait.
Dyn(PolyTraitDeclRef)
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, TraitImplId> + Visit<'s, GenericArgs> + Visit<'s, ClauseDbVar> + Visit<'s, Box<TraitRefKind>> + Visit<'s, TraitDeclId> + Visit<'s, TraitClauseId> + Visit<'s, TraitItemName> + Visit<'s, PolyTraitDeclRef> + Visit<'s, Vector<TraitClauseId, TraitRef>> + Visit<'s, Vec<(TraitItemName, Ty)>>,
impl<'s, V> Drive<'s, V> for TraitRefKindwhere
V: Visitor + Visit<'s, TraitImplId> + Visit<'s, GenericArgs> + Visit<'s, ClauseDbVar> + Visit<'s, Box<TraitRefKind>> + Visit<'s, TraitDeclId> + Visit<'s, TraitClauseId> + Visit<'s, TraitItemName> + Visit<'s, PolyTraitDeclRef> + Visit<'s, Vector<TraitClauseId, TraitRef>> + Visit<'s, Vec<(TraitItemName, Ty)>>,
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, TraitImplId> + VisitMut<'s, GenericArgs> + VisitMut<'s, ClauseDbVar> + VisitMut<'s, Box<TraitRefKind>> + VisitMut<'s, TraitDeclId> + VisitMut<'s, TraitClauseId> + VisitMut<'s, TraitItemName> + VisitMut<'s, PolyTraitDeclRef> + VisitMut<'s, Vector<TraitClauseId, TraitRef>> + VisitMut<'s, Vec<(TraitItemName, Ty)>>,
impl<'s, V> DriveMut<'s, V> for TraitRefKindwhere
V: Visitor + VisitMut<'s, TraitImplId> + VisitMut<'s, GenericArgs> + VisitMut<'s, ClauseDbVar> + VisitMut<'s, Box<TraitRefKind>> + VisitMut<'s, TraitDeclId> + VisitMut<'s, TraitClauseId> + VisitMut<'s, TraitItemName> + VisitMut<'s, PolyTraitDeclRef> + VisitMut<'s, Vector<TraitClauseId, TraitRef>> + VisitMut<'s, Vec<(TraitItemName, Ty)>>,
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<C: AstFormatter> FmtWithCtx<C> for TraitRefKind
impl<C: AstFormatter> FmtWithCtx<C> for TraitRefKind
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
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,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§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,
fn substitute(self, generics: &GenericArgs) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
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_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.