Support non-doc attrs in extension trait macro
The `define_extension_trait` macro originally didn't support `#[inline]` or other attributes for simplicity. We still want them so this commit adds basic support for it. It adds the `doc` attributes to trait *definition* only and adds all other attributes to the *implementation* only. This should support `#[inline]` and other attributes. The downside is it doesn't support adding non-doc attributes to trait *definition* but I can't think of any relevant ones that we would want and we can find a solution later if we do.
This commit is contained in:
parent
ca1735f24c
commit
fcc3cb03f0
|
@ -214,6 +214,38 @@ macro_rules! impl_asref_push_bytes {
|
||||||
}
|
}
|
||||||
pub(crate) use impl_asref_push_bytes;
|
pub(crate) use impl_asref_push_bytes;
|
||||||
|
|
||||||
|
macro_rules! only_doc_attrs {
|
||||||
|
({}, {$($fun:tt)*}) => {
|
||||||
|
$($fun)*
|
||||||
|
};
|
||||||
|
({#[doc = $($doc:tt)*] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { #[doc = $($doc)*] $($fun)* });
|
||||||
|
};
|
||||||
|
({#[doc($($doc:tt)*)] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { #[doc($($doc)*)] $($fun)* });
|
||||||
|
};
|
||||||
|
({#[$($other:tt)*] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { $($fun)* });
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub(crate) use only_doc_attrs;
|
||||||
|
|
||||||
|
macro_rules! only_non_doc_attrs {
|
||||||
|
({}, {$($fun:tt)*}) => {
|
||||||
|
$($fun)*
|
||||||
|
};
|
||||||
|
({#[doc = $($doc:tt)*] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { #[doc = $($doc)*] $($fun)* });
|
||||||
|
};
|
||||||
|
({#[doc($($doc:tt)*)] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { $($fun)* });
|
||||||
|
};
|
||||||
|
({#[$($other:tt)*] $($all_attrs:tt)*}, {$($fun:tt)*}) => {
|
||||||
|
$crate::internal_macros::only_doc_attrs!({ $($all_attrs)* }, { #[$(other)*] $($fun)* });
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub(crate) use only_non_doc_attrs;
|
||||||
|
|
||||||
/// Defines an trait `$trait_name` and implements it for `ty`, used to define extension traits.
|
/// Defines an trait `$trait_name` and implements it for `ty`, used to define extension traits.
|
||||||
macro_rules! define_extension_trait {
|
macro_rules! define_extension_trait {
|
||||||
($(#[$($trait_attrs:tt)*])* $trait_vis:vis trait $trait_name:ident impl for $ty:ident {
|
($(#[$($trait_attrs:tt)*])* $trait_vis:vis trait $trait_name:ident impl for $ty:ident {
|
||||||
|
@ -224,14 +256,23 @@ macro_rules! define_extension_trait {
|
||||||
}) => {
|
}) => {
|
||||||
$(#[$($trait_attrs)*])* $trait_vis trait $trait_name {
|
$(#[$($trait_attrs)*])* $trait_vis trait $trait_name {
|
||||||
$(
|
$(
|
||||||
$(#[$($fn_attrs)*])*
|
$crate::internal_macros::only_doc_attrs! {
|
||||||
fn $fn$(<$($gen: $gent),*>)?($($param_name: $param_type),*) $( -> $ret )?;
|
{ $(#[$($fn_attrs)*])* },
|
||||||
|
{
|
||||||
|
fn $fn$(<$($gen: $gent),*>)?($($param_name: $param_type),*) $( -> $ret )?;
|
||||||
|
}
|
||||||
|
}
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $trait_name for $ty {
|
impl $trait_name for $ty {
|
||||||
$(
|
$(
|
||||||
fn $fn$(<$($gen: $gent),*>)?($($param_name: $param_type),*) $( -> $ret )? $body
|
$crate::internal_macros::only_non_doc_attrs! {
|
||||||
|
{ $(#[$($fn_attrs)*])* },
|
||||||
|
{
|
||||||
|
fn $fn$(<$($gen: $gent),*>)?($($param_name: $param_type),*) $( -> $ret )? $body
|
||||||
|
}
|
||||||
|
}
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue