#[doc(hidden)]
#[macro_export]
macro_rules! __extract_and_apply_cfg_attributes {
{
() $($output:tt)*
} => {
$($output)*
};
{
(
#[cfg $($args:tt)*]
$($rest:tt)*
)
$($output:tt)*
} => {
#[cfg $($args)*]
{
$crate::__extract_and_apply_cfg_attributes! {
($($rest)*)
$($output)*
}
}
};
{
(
#[$($m_ignored:tt)*]
$($rest:tt)*
)
$($output:tt)*
} => {
$crate::__extract_and_apply_cfg_attributes! {
($($rest)*)
$($output)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __extract_method_attributes {
{
($($m:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_method_attributes_inner! {
($($m)*)
() () () () ()
($out_macro)
$($out_args)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __extract_method_attributes_inner {
{
()
()
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__macro_helpers::compile_error!("must specify the desired selector using `#[unsafe(method(...))]` or `#[unsafe(method_id(...))]`");
$out_macro! {
$($out_args)*
(method(invalidSelector))
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
}
};
{
()
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$out_macro! {
$($out_args)*
($($method)*)
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
}
};
{
(
#[unsafe(method($($parsed:tt)*))]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("method`/`method_id"; $($method)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
(method($($parsed)*))
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[method($($parsed:tt)*)]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__macro_helpers::compile_error!($crate::__macro_helpers::concat!(
"The #[method] attribute is now unsafe, and must be used as #[unsafe(method(",
$crate::__macro_helpers::stringify!($($parsed)*),
"))]",
));
$crate::__handle_duplicate!("method`/`method_id"; $($method)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
(method($($parsed)*))
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[unsafe(method_id($($parsed:tt)*))]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("method`/`method_id"; $($method)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
(method_id($($parsed)*))
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[method_id($($parsed:tt)*)]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__macro_helpers::compile_error!($crate::__macro_helpers::concat!(
"The #[method_id] attribute is now unsafe, and must be used as #[unsafe(method_id(",
$crate::__macro_helpers::stringify!($($parsed)*),
"))]",
));
$crate::__handle_duplicate!("method`/`method_id"; $($method)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
(method_id($($parsed)*))
($($method_family)*)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[unsafe(method_family = $($parsed:tt)+)]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("method_family"; $($method_family)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($parsed)+)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[method_family = $($parsed:tt)+]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__macro_helpers::compile_error!($crate::__macro_helpers::concat!(
"The #[method_family] attribute is unsafe, and must be used as #[unsafe(method_family = ",
$crate::__macro_helpers::stringify!($($parsed)*),
")]",
));
$crate::__handle_duplicate!("method_family"; $($method_family)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($parsed)+)
($($optional)*)
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[optional]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("optional"; $($optional)*);
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($method_family)*)
(#[optional])
($($attr_method)*)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
{
(
#[cfg $($parsed:tt)*]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($method_family)*)
($($optional)*)
(
$($attr_method)*
#[cfg $($parsed)*]
)
(
$($attr_use)*
#[cfg $($parsed)*]
)
($out_macro)
$($out_args)*
}
};
{
(
#[allow $($parsed:tt)*]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($method_family)*)
($($optional)*)
(
$($attr_method)*
#[allow $($parsed)*]
)
(
$($attr_use)*
#[allow $($parsed)*]
)
($out_macro)
$($out_args)*
}
};
{
(
#[$($parsed:tt)*]
$($rest:tt)*
)
($($method:tt)*)
($($method_family:tt)*)
($($optional:tt)*)
($($attr_method:tt)*)
($($attr_use:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_method_attributes_inner! {
($($rest)*)
($($method)*)
($($method_family)*)
($($optional)*)
(
$($attr_method)*
#[$($parsed)*]
)
($($attr_use)*)
($out_macro)
$($out_args)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __extract_struct_attributes {
{
($($attrs:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_struct_attributes_inner! {
($($attrs)*)
() () () () () () ()
($out_macro)
$($out_args)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __extract_struct_attributes_inner {
{
()
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$out_macro! {
$($out_args)*
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
}
};
{
(
#[unsafe(super($($parsed:tt)*))]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("super"; $($superclasses)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
(unsafe $($parsed)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[unsafe(super = $parsed:path)]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("super"; $($superclasses)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
(unsafe $parsed)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[super($($parsed:tt)*)]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("super"; $($superclasses)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
(safe $($parsed)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[super = $parsed:path]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("super"; $($superclasses)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
(safe $parsed)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[thread_kind = $($parsed:tt)+]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("thread_kind"; $($thread_kind)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($parsed)+)
($($name)*)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[name = $($parsed:tt)+]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("name"; $($name)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($parsed)+)
($($ivars)*)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[ivars = $($parsed:tt)+]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__handle_duplicate!("ivars"; $($ivars)*);
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($parsed)+)
($($derives)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[derive($($parsed:tt)*)]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*, $($parsed)*)
($($attr_struct)*)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
{
(
#[cfg $($parsed:tt)*]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
(
$($attr_struct)*
#[cfg $($parsed)*]
)
(
$($attr_impl)*
#[cfg $($parsed)*]
)
($out_macro)
$($out_args)*
}
};
{
(
#[allow $($parsed:tt)*]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
(
$($attr_struct)*
#[allow $($parsed)*]
)
(
$($attr_impl)*
#[allow $($parsed)*]
)
($out_macro)
$($out_args)*
}
};
{
(
#[$($parsed:tt)*]
$($rest:tt)*
)
($($superclasses:tt)*)
($($thread_kind:tt)*)
($($name:tt)*)
($($ivars:tt)*)
($($derives:tt)*)
($($attr_struct:tt)*)
($($attr_impl:tt)*)
($out_macro:path)
$($out_args:tt)*
} => {
$crate::__extract_struct_attributes_inner! {
($($rest)*)
($($superclasses)*)
($($thread_kind)*)
($($name)*)
($($ivars)*)
($($derives)*)
(
$($attr_struct)*
#[$($parsed)*]
)
($($attr_impl)*)
($out_macro)
$($out_args)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __handle_duplicate {
(
$name:literal;
// No existing value
) => {
};
(
$name:literal;
$($existing:tt)+ // Has existing value
) => {
$crate::__macro_helpers::compile_error!($crate::__macro_helpers::concat!(
"cannot specify the `",
$name,
"` attribute twice",
));
};
}