@@ -26,22 +26,13 @@ use syn::{Data, DeriveInput, Fields, parse_macro_input};
2626pub fn derive_cache_hash ( input : TokenStream ) -> TokenStream {
2727 let ast = parse_macro_input ! ( input as DeriveInput ) ;
2828 let name = & ast. ident ;
29- let ( impl_generics, ty_generics, where_clause) = ast. generics . split_for_impl ( ) ;
30-
31- // Build additional `T: CacheHash` bounds for each type parameter.
32- let extra_bounds = ast. generics . type_params ( ) . map ( |tp| {
33- let ident = & tp. ident ;
34- quote ! { #ident: graphene_hash:: CacheHash }
35- } ) ;
36- let where_clause = if ast. generics . type_params ( ) . count ( ) > 0 {
37- let existing = where_clause. map ( |w| quote ! { #w } ) . unwrap_or_default ( ) ;
38- quote ! {
39- #existing
40- where #( #extra_bounds, ) *
29+ let mut generics = ast. generics . clone ( ) ;
30+ for param in & mut generics. params {
31+ if let syn:: GenericParam :: Type ( type_param) = param {
32+ type_param. bounds . push ( syn:: parse_quote!( graphene_hash:: CacheHash ) ) ;
4133 }
42- } else {
43- where_clause. map ( |w| quote ! { #w } ) . unwrap_or_default ( )
44- } ;
34+ }
35+ let ( impl_generics, ty_generics, where_clause) = generics. split_for_impl ( ) ;
4536
4637 let body = match & ast. data {
4738 Data :: Struct ( s) => hash_fields ( & s. fields , quote ! { self } ) ,
@@ -89,7 +80,7 @@ pub fn derive_cache_hash(input: TokenStream) -> TokenStream {
8980 }
9081 }
9182 }
92- Data :: Union ( _) => panic ! ( "CacheHash cannot be derived for unions" ) ,
83+ Data :: Union ( _) => return syn :: Error :: new ( ast . ident . span ( ) , "CacheHash cannot be derived for unions" ) . to_compile_error ( ) . into ( ) ,
9384 } ;
9485
9586 quote ! {
0 commit comments