| //! 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 |
| } |
| } |
| }; |
| } |