pub enum TraitRefKind {
TraitImpl(TraitImplId, GenericArgs),
Clause(TraitClauseId),
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(TraitClauseId)
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 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<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