non_std 0.1.4

Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind.
Documentation

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 = &item_parsed.generics;
  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 >
    // where
      #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 >
    // where
      #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 >
    // where
      #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 >
    // where
      #generics_where
    {
      #[ inline ]
      fn clone( &self ) -> Self { clone_dyn::_clone_boxed( &**self ) }
    }

  };

  Ok( result )
}