+fn make_impl(
+ traitname: TokStr,
+ input: &syn::DeriveInput,
+ typename: &syn::Ident,
+ args: &MtArgs,
+ code: TokStr,
+) -> TokenStream {
+ let generics = &input.generics;
+ let bounds = args.bounds.clone().or_else(|| {
+ if generics.params.is_empty() {
+ None
+ } else {
+ Some(
+ syn::parse(
+ generics
+ .params
+ .iter()
+ .rfold(quote! { where }, |before, t| match t {
+ syn::GenericParam::Type(x) => quote! { #before #x: #traitname, },
+ _ => before,
+ })
+ .into(),
+ )
+ .expect("invalid where clause"),
+ )
+ }
+ });
+
+ quote! {
+ #[automatically_derived]
+ impl #generics #traitname for #typename #generics #bounds { #code }
+ }
+ .into()
+}
+