pub struct TraitImpl {
pub def_id: TraitImplId,
pub item_meta: ItemMeta,
pub src: TraitImplSource,
pub impl_trait: TraitDeclRef,
pub is_negative: bool,
pub is_unsafe: bool,
pub generics: GenericParams,
pub implied_trait_refs: IndexVec<TraitClauseId, TraitRef>,
pub consts: IndexMap<AssocConstId, GlobalDeclRef>,
pub types: IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>,
pub methods: IndexMap<TraitMethodId, Binder<FunDeclRef>>,
pub vtable: VTableDecl,
}Expand description
A trait implementation.
For instance:
impl Foo for List {
type Bar = ...
fn baz(...) { ... }
}Fields§
§def_id: TraitImplId§item_meta: ItemMeta§src: TraitImplSource§impl_trait: TraitDeclRefThe information about the implemented trait. Note that this contains the instantiation of the “parent” clauses.
is_negative: boolWhether this is a negative impl (impl !Trait for Type).
is_unsafe: boolWhether this is an unsafe impl.
generics: GenericParams§implied_trait_refs: IndexVec<TraitClauseId, TraitRef>The trait references for the parent clauses (see TraitDecl).
consts: IndexMap<AssocConstId, GlobalDeclRef>The implemented associated constants.
types: IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>The implemented associated types.
methods: IndexMap<TraitMethodId, Binder<FunDeclRef>>The implemented methods
vtable: VTableDeclThe virtual table instance for this trait implementation.
Implementations§
Source§impl TraitImpl
impl TraitImpl
pub fn methods(&self) -> impl Iterator<Item = &Binder<FunDeclRef>>
Sourcepub fn is_unsafe_to_declare(&self, _krate: &TranslatedCrate) -> bool
pub fn is_unsafe_to_declare(&self, _krate: &TranslatedCrate) -> bool
Whether this trait impl is unsafe to declare, because it is an unsafe impl (safety.unsafe-impl)
or it has an unsafe attribute (safety.unsafe-attribute).
Trait Implementations§
Source§impl AstVisitable for TraitImpl
impl AstVisitable for TraitImpl
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
Recursively visit this type with the provided visitor. This calls the visitor’s
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>
Recursively visit this type with the provided visitor. This calls the visitor’s
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
Recursively visit this type with the provided visitor. This calls the visitor’s
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
Visit all occurrences of that type inside
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
Visit all occurrences of that type inside
self, in pre-order traversal.Source§impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TraitImplwhere
TraitImplId: DeserializeState<'de, __State>,
ItemMeta: DeserializeState<'de, __State>,
TraitImplSource: DeserializeState<'de, __State>,
TraitDeclRef: DeserializeState<'de, __State>,
bool: DeserializeState<'de, __State>,
GenericParams: DeserializeState<'de, __State>,
IndexVec<TraitClauseId, TraitRef>: DeserializeState<'de, __State>,
IndexMap<AssocConstId, GlobalDeclRef>: DeserializeState<'de, __State>,
IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>: DeserializeState<'de, __State>,
IndexMap<TraitMethodId, Binder<FunDeclRef>>: DeserializeState<'de, __State>,
VTableDecl: DeserializeState<'de, __State>,
impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TraitImplwhere
TraitImplId: DeserializeState<'de, __State>,
ItemMeta: DeserializeState<'de, __State>,
TraitImplSource: DeserializeState<'de, __State>,
TraitDeclRef: DeserializeState<'de, __State>,
bool: DeserializeState<'de, __State>,
GenericParams: DeserializeState<'de, __State>,
IndexVec<TraitClauseId, TraitRef>: DeserializeState<'de, __State>,
IndexMap<AssocConstId, GlobalDeclRef>: DeserializeState<'de, __State>,
IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>: DeserializeState<'de, __State>,
IndexMap<TraitMethodId, Binder<FunDeclRef>>: DeserializeState<'de, __State>,
VTableDecl: DeserializeState<'de, __State>,
fn deserialize_state<__D>(
__state: &__State,
__deserializer: __D,
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for TraitImplwhere
V: Visitor + Visit<'s, TraitImplId> + Visit<'s, ItemMeta> + Visit<'s, TraitImplSource> + Visit<'s, TraitDeclRef> + Visit<'s, bool> + Visit<'s, GenericParams> + Visit<'s, IndexVec<TraitClauseId, TraitRef>> + Visit<'s, IndexMap<AssocConstId, GlobalDeclRef>> + Visit<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + Visit<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + Visit<'s, VTableDecl>,
impl<'s, V> Drive<'s, V> for TraitImplwhere
V: Visitor + Visit<'s, TraitImplId> + Visit<'s, ItemMeta> + Visit<'s, TraitImplSource> + Visit<'s, TraitDeclRef> + Visit<'s, bool> + Visit<'s, GenericParams> + Visit<'s, IndexVec<TraitClauseId, TraitRef>> + Visit<'s, IndexMap<AssocConstId, GlobalDeclRef>> + Visit<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + Visit<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + Visit<'s, VTableDecl>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
Call
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for TraitImplwhere
V: Visitor + VisitMut<'s, TraitImplId> + VisitMut<'s, ItemMeta> + VisitMut<'s, TraitImplSource> + VisitMut<'s, TraitDeclRef> + VisitMut<'s, bool> + VisitMut<'s, GenericParams> + VisitMut<'s, IndexVec<TraitClauseId, TraitRef>> + VisitMut<'s, IndexMap<AssocConstId, GlobalDeclRef>> + VisitMut<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + VisitMut<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + VisitMut<'s, VTableDecl>,
impl<'s, V> DriveMut<'s, V> for TraitImplwhere
V: Visitor + VisitMut<'s, TraitImplId> + VisitMut<'s, ItemMeta> + VisitMut<'s, TraitImplSource> + VisitMut<'s, TraitDeclRef> + VisitMut<'s, bool> + VisitMut<'s, GenericParams> + VisitMut<'s, IndexVec<TraitClauseId, TraitRef>> + VisitMut<'s, IndexMap<AssocConstId, GlobalDeclRef>> + VisitMut<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + VisitMut<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + VisitMut<'s, VTableDecl>,
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>
Call
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveTwo<'s, V> for TraitImplwhere
V: Visitor<Break: Default> + VisitTwo<'s, TraitImplId> + VisitTwo<'s, ItemMeta> + VisitTwo<'s, TraitImplSource> + VisitTwo<'s, TraitDeclRef> + VisitTwo<'s, bool> + VisitTwo<'s, GenericParams> + VisitTwo<'s, IndexVec<TraitClauseId, TraitRef>> + VisitTwo<'s, IndexMap<AssocConstId, GlobalDeclRef>> + VisitTwo<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + VisitTwo<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + VisitTwo<'s, VTableDecl>,
impl<'s, V> DriveTwo<'s, V> for TraitImplwhere
V: Visitor<Break: Default> + VisitTwo<'s, TraitImplId> + VisitTwo<'s, ItemMeta> + VisitTwo<'s, TraitImplSource> + VisitTwo<'s, TraitDeclRef> + VisitTwo<'s, bool> + VisitTwo<'s, GenericParams> + VisitTwo<'s, IndexVec<TraitClauseId, TraitRef>> + VisitTwo<'s, IndexMap<AssocConstId, GlobalDeclRef>> + VisitTwo<'s, IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>> + VisitTwo<'s, IndexMap<TraitMethodId, Binder<FunDeclRef>>> + VisitTwo<'s, VTableDecl>,
Source§fn drive_two_inner(
&'s self,
other: &'s Self,
visitor: &mut V,
) -> ControlFlow<V::Break>
fn drive_two_inner( &'s self, other: &'s Self, visitor: &mut V, ) -> ControlFlow<V::Break>
Call
v.visit() on the immediate contents of self and other, if they correspond. If
the values don’t match up, this returns Break(Default::default()).Source§impl<C: AstFormatter> FmtWithCtx<C> for TraitImpl
impl<C: AstFormatter> FmtWithCtx<C> for TraitImpl
Source§impl<__State: ?Sized> SerializeState<__State> for TraitImplwhere
TraitImplId: SerializeState<__State>,
ItemMeta: SerializeState<__State>,
TraitImplSource: SerializeState<__State>,
TraitDeclRef: SerializeState<__State>,
bool: SerializeState<__State>,
GenericParams: SerializeState<__State>,
IndexVec<TraitClauseId, TraitRef>: SerializeState<__State>,
IndexMap<AssocConstId, GlobalDeclRef>: SerializeState<__State>,
IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>: SerializeState<__State>,
IndexMap<TraitMethodId, Binder<FunDeclRef>>: SerializeState<__State>,
VTableDecl: SerializeState<__State>,
impl<__State: ?Sized> SerializeState<__State> for TraitImplwhere
TraitImplId: SerializeState<__State>,
ItemMeta: SerializeState<__State>,
TraitImplSource: SerializeState<__State>,
TraitDeclRef: SerializeState<__State>,
bool: SerializeState<__State>,
GenericParams: SerializeState<__State>,
IndexVec<TraitClauseId, TraitRef>: SerializeState<__State>,
IndexMap<AssocConstId, GlobalDeclRef>: SerializeState<__State>,
IndexMap<AssocTypeId, Binder<TraitAssocTyImpl>>: SerializeState<__State>,
IndexMap<TraitMethodId, Binder<FunDeclRef>>: SerializeState<__State>,
VTableDecl: SerializeState<__State>,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for TraitImpl
impl RefUnwindSafe for TraitImpl
impl Send for TraitImpl
impl Sync for TraitImpl
impl Unpin for TraitImpl
impl UnsafeUnpin for TraitImpl
impl UnwindSafe for TraitImpl
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> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 moreimpl<T> Mappable for T
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn type_info(&self) -> TypeInfo
fn type_info(&self) -> TypeInfo
Compute various bits of information about the contents of this value. See methods on
TypeInfo.Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
Visit the variables contained in
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
Substitute the generic variables inside
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you must use
substitute_with_self or substitute_inner_binder, otherwise you’ll get panics.Source§fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
Substitute the generic variables inside
self by replacing them with the provided values.
This is appropriate when substituting an inner binder.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Substitute only the type, region and const generic args.
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.Source§fn substitute_with_tref(self, tref: &TraitRef) -> Self
fn substitute_with_tref(self, tref: &TraitRef) -> Self
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.Source§fn try_substitute_with_tref(
self,
tref: &TraitRef,
) -> Result<Self, GenericsMismatch>
fn try_substitute_with_tref( self, tref: &TraitRef, ) -> Result<Self, GenericsMismatch>
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.fn try_substitute( self, generics: &GenericArgs, ) -> Result<Self, GenericsMismatch>
fn try_substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Result<Self, GenericsMismatch>
Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Move under one binder.
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
Move under
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Move from under one binder.
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
Move the value out of
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>
Visit the de Bruijn ids contained in
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.Source§fn collect_regions(&self) -> impl Iterator<Item = Region>
fn collect_regions(&self) -> impl Iterator<Item = Region>
Collect the regions contained in
self.Source§fn replace_erased_regions(self, f: impl FnMut() -> Region) -> Self
fn replace_erased_regions(self, f: impl FnMut() -> Region) -> Self
Replace all the erased regions by the output of the provided function. Binders levels are
handled automatically.