97 lines
3.5 KiB
Rust
97 lines
3.5 KiB
Rust
//! Macros that should be exported from both `darling_core` and `darling`.
|
|
//! Note that these are **sym-linked** into the main code, and so cannot declare on items that are exported differently
|
|
//! in `darling_core` vs. `darling`.
|
|
|
|
/// Generator for `UsesTypeParam` impls that unions the used type parameters of the selected fields.
|
|
///
|
|
/// # Usage
|
|
/// The macro takes the type implementing the trait as the first argument, then a comma-separated list of
|
|
/// fields for the rest of its arguments.
|
|
///
|
|
/// The type of each passed-in field must implement `UsesTypeParams`, or the resulting code won't compile.
|
|
///
|
|
/// ```rust
|
|
/// # extern crate syn;
|
|
/// # use darling_core::uses_type_params;
|
|
/// #
|
|
/// struct MyField {
|
|
/// ty: syn::Type,
|
|
/// }
|
|
///
|
|
/// uses_type_params!(MyField, ty);
|
|
///
|
|
/// fn main() {
|
|
/// // no test run
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// `darling` cannot derive this trait automatically, as it doesn't know which information extracted from
|
|
/// proc-macro input is meant to constitute "using" the type parameter, but crate consumers should
|
|
/// implement it by hand or using the macro.
|
|
#[macro_export]
|
|
macro_rules! uses_type_params {
|
|
($impl_type:ty, $accessor:ident) => {
|
|
impl $crate::usage::UsesTypeParams for $impl_type {
|
|
fn uses_type_params<'gen>(
|
|
&self,
|
|
options: &$crate::usage::Options,
|
|
type_set: &'gen $crate::usage::IdentSet
|
|
) -> $crate::usage::IdentRefSet<'gen> {
|
|
self.$accessor.uses_type_params(options, type_set)
|
|
}
|
|
}
|
|
};
|
|
($impl_type:ty, $first:ident, $($field:ident),+) => {
|
|
impl $crate::usage::UsesTypeParams for $impl_type {
|
|
fn uses_type_params<'gen>(
|
|
&self,
|
|
options: &$crate::usage::Options,
|
|
type_set: &'gen $crate::usage::IdentSet
|
|
) -> $crate::usage::IdentRefSet<'gen> {
|
|
let mut hits = self.$first.uses_type_params(options, type_set);
|
|
$(
|
|
hits.extend(self.$field.uses_type_params(options, type_set));
|
|
)*
|
|
hits
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/// Generator for `UsesLifetimes` impls that unions the used lifetimes of the selected fields.
|
|
///
|
|
/// # Usage
|
|
/// The macro takes the type implementing the trait as the first argument, then a comma-separated list of
|
|
/// fields for the rest of its arguments.
|
|
///
|
|
/// The type of each passed-in field must implement `UsesLifetimes`, or the resulting code won't compile.
|
|
#[macro_export]
|
|
macro_rules! uses_lifetimes {
|
|
($impl_type:ty, $accessor:ident) => {
|
|
impl $crate::usage::UsesLifetimes for $impl_type {
|
|
fn uses_lifetimes<'gen>(
|
|
&self,
|
|
options: &$crate::usage::Options,
|
|
type_set: &'gen $crate::usage::LifetimeSet
|
|
) -> $crate::usage::LifetimeRefSet<'gen> {
|
|
self.$accessor.uses_lifetimes(options, type_set)
|
|
}
|
|
}
|
|
};
|
|
($impl_type:ty, $first:ident, $($field:ident),+) => {
|
|
impl $crate::usage::UsesLifetimes for $impl_type {
|
|
fn uses_lifetimes<'gen>(
|
|
&self,
|
|
options: &$crate::usage::Options,
|
|
type_set: &'gen $crate::usage::LifetimeSet
|
|
) -> $crate::usage::LifetimeRefSet<'gen> {
|
|
let mut hits = self.$first.uses_lifetimes(options, type_set);
|
|
$(
|
|
hits.extend(self.$field.uses_lifetimes(options, type_set));
|
|
)*
|
|
hits
|
|
}
|
|
}
|
|
};
|
|
}
|