pub(crate) struct TraitDef<'a> {
pub span: Span,
pub path: Path,
pub skip_path_as_bound: bool,
pub needs_copy_as_bound_if_packed: bool,
pub additional_bounds: Vec<Ty>,
pub supports_unions: bool,
pub methods: Vec<MethodDef<'a>>,
pub associated_types: Vec<(Ident, Ty)>,
pub is_const: bool,
}
Fields§
§span: Span
The span for the current #[derive(Foo)] header.
path: Path
Path of the trait, including any type parameters
skip_path_as_bound: bool
Whether to skip adding the current trait as a bound to the type parameters of the type.
needs_copy_as_bound_if_packed: bool
Whether Copy
is needed as an additional bound on type parameters in a packed struct.
additional_bounds: Vec<Ty>
Additional bounds required of any type parameters of the type, other than the current trait
supports_unions: bool
Can this trait be derived for unions?
methods: Vec<MethodDef<'a>>
§associated_types: Vec<(Ident, Ty)>
§is_const: bool
Implementations§
Source§impl<'a> TraitDef<'a>
impl<'a> TraitDef<'a>
pub(crate) fn expand( self, cx: &ExtCtxt<'_>, mitem: &MetaItem, item: &'a Annotatable, push: &mut dyn FnMut(Annotatable), )
pub(crate) fn expand_ext( self, cx: &ExtCtxt<'_>, mitem: &MetaItem, item: &'a Annotatable, push: &mut dyn FnMut(Annotatable), from_scratch: bool, )
Sourcefn create_derived_impl(
&self,
cx: &ExtCtxt<'_>,
type_ident: Ident,
generics: &Generics,
field_tys: Vec<P<Ty>>,
methods: Vec<P<AssocItem>>,
is_packed: bool,
) -> P<Item>
fn create_derived_impl( &self, cx: &ExtCtxt<'_>, type_ident: Ident, generics: &Generics, field_tys: Vec<P<Ty>>, methods: Vec<P<AssocItem>>, is_packed: bool, ) -> P<Item>
Given that we are deriving a trait DerivedTrait
for a type like:
struct Struct<'a, ..., 'z, A, B: DeclaredTrait, C, ..., Z>
where
C: WhereTrait,
{
a: A,
b: B::Item,
b1: <B as DeclaredTrait>::Item,
c1: <C as WhereTrait>::Item,
c2: Option<<C as WhereTrait>::Item>,
...
}
create an impl like:
impl<'a, ..., 'z, A, B: DeclaredTrait, C, ..., Z>
where
C: WhereTrait,
A: DerivedTrait + B1 + ... + BN,
B: DerivedTrait + B1 + ... + BN,
C: DerivedTrait + B1 + ... + BN,
B::Item: DerivedTrait + B1 + ... + BN,
<C as WhereTrait>::Item: DerivedTrait + B1 + ... + BN,
...
{
...
}
where B1, …, BN are the bounds given by bounds_paths
.’. Z is a phantom type, and
therefore does not get bound by the derived trait.
fn expand_struct_def( &self, cx: &ExtCtxt<'_>, struct_def: &'a VariantData, type_ident: Ident, generics: &Generics, from_scratch: bool, is_packed: bool, ) -> P<Item>
fn expand_enum_def( &self, cx: &ExtCtxt<'_>, enum_def: &'a EnumDef, type_ident: Ident, generics: &Generics, from_scratch: bool, ) -> P<Item>
Source§impl<'a> TraitDef<'a>
impl<'a> TraitDef<'a>
fn summarise_struct( &self, cx: &ExtCtxt<'_>, struct_def: &VariantData, ) -> StaticFields
fn create_struct_patterns( &self, cx: &ExtCtxt<'_>, struct_path: Path, struct_def: &'a VariantData, prefixes: &[String], by_ref: ByRef, ) -> ThinVec<P<Pat>>
fn create_fields<F>( &self, struct_def: &'a VariantData, mk_exprs: F, ) -> Vec<FieldInfo>
fn mk_pattern_ident(&self, prefix: &str, i: usize) -> Ident
fn create_struct_pattern_fields( &self, cx: &ExtCtxt<'_>, struct_def: &'a VariantData, prefixes: &[String], ) -> Vec<FieldInfo>
fn create_struct_field_access_fields( &self, cx: &ExtCtxt<'_>, selflike_args: &[P<Expr>], struct_def: &'a VariantData, is_packed: bool, ) -> Vec<FieldInfo>
Auto Trait Implementations§
impl<'a> !DynSend for TraitDef<'a>
impl<'a> !DynSync for TraitDef<'a>
impl<'a> Freeze for TraitDef<'a>
impl<'a> !RefUnwindSafe for TraitDef<'a>
impl<'a> !Send for TraitDef<'a>
impl<'a> !Sync for TraitDef<'a>
impl<'a> Unpin for TraitDef<'a>
impl<'a> !UnwindSafe for TraitDef<'a>
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, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 144 bytes