pub enum TraitRefKind {
TraitImpl(TraitImplId, GenericArgs),
Clause(ClauseDbVar),
ParentClause(Box<TraitRefKind>, TraitDeclId, TraitClauseId),
ItemClause(Box<TraitRefKind>, TraitDeclId, TraitItemName, TraitClauseId),
SelfId,
BuiltinOrAuto(PolyTraitDeclRef),
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
Self, in case of trait declarations/implementations.
Putting Self at the end on purpose, so that when ordering the clauses we start with the other clauses (in particular, the local clauses). It is useful to give priority to the local clauses when solving the trait obligations which are fullfilled by the trait parameters.
BuiltinOrAuto(PolyTraitDeclRef)
A specific builtin trait implementation like core::marker::Sized or auto trait implementation like [core::marker::Syn].
Dyn(PolyTraitDeclRef)
The automatically-generated implementation for dyn Trait
.
Unknown(String)
For error reporting.
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>,
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>,
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>,
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>,
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
§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(&mut self, generics: &GenericArgs)
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.