use proc_macro_tools::*;
pub type Result< T > = std::result::Result< T, syn::Error >;
pub fn clone_dyn( _attr : proc_macro::TokenStream, item : proc_macro::TokenStream ) -> Result< proc_macro2::TokenStream >
{
let item_parsed = match syn::parse::< syn::ItemTrait >( item )
{
Ok( original ) => original,
Err( err ) => return Err( err ),
};
let name_ident = &item_parsed.ident;
let generics_analyzed = item_parsed.generics_analyze();
let generics_params = &generics_analyzed.generics.params;
let generics_where = &generics_analyzed.generics.where_clause;
let generics_names = &generics_analyzed.names;
let result = qt!
{
#item_parsed
impl < 'c, #generics_params > Clone
for Box< dyn #name_ident< #( #generics_names ),* > + 'c >
#generics_where
{
#[ inline ]
fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) }
}
impl < 'c, #generics_params > Clone
for Box< dyn #name_ident< #( #generics_names ),* > + Send + 'c >
#generics_where
{
#[ inline ]
fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) }
}
impl < 'c, #generics_params > Clone
for Box< dyn #name_ident< #( #generics_names ),* > + Sync + 'c >
#generics_where
{
#[ inline ]
fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) }
}
impl < 'c, #generics_params > Clone
for Box< dyn #name_ident< #( #generics_names ),* > + Send + Sync + 'c >
#generics_where
{
#[ inline ]
fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) }
}
};
Ok( result )
}