@@ -14,8 +14,8 @@ use proc_macro::TokenStream;
1414use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
1515use quote:: quote;
1616use syn:: {
17- parse_macro_input, parse_quote, punctuated:: Punctuated , DeriveInput , Ident , PredicateType ,
18- Token , TraitBound , Type , TypeParam , TypeParamBound , WhereClause , WherePredicate ,
17+ parse_macro_input, parse_quote, punctuated:: Punctuated , DeriveInput , Ident , Lifetime ,
18+ PredicateType , Token , TraitBound , Type , TypeParam , TypeParamBound , WhereClause , WherePredicate ,
1919} ;
2020
2121/// Derive the [`Signer`] trait for a type which impls [`DigestSigner`].
@@ -51,12 +51,19 @@ fn emit_signer_impl(input: DeriveInput) -> TokenStream2 {
5151 ) ;
5252
5353 let name = params. name ;
54+ let lifetimes = params. lifetimes ;
5455 let impl_generics = params. impl_generics ;
5556 let ty_generics = params. ty_generics ;
5657 let where_clause = params. where_clause ;
5758
59+ let sep = if lifetimes. is_empty ( ) {
60+ quote ! { }
61+ } else {
62+ quote ! { , }
63+ } ;
64+
5865 quote ! {
59- impl <#( #impl_generics) , * > :: signature:: Signer <#s_ident> for #name<#( #ty_generics) , * >
66+ impl <#( #lifetimes ) , * #sep # ( # impl_generics) , * > :: signature:: Signer <#s_ident> for #name<# ( #lifetimes ) , * #sep #( #ty_generics) , * >
6067 #where_clause
6168 {
6269 fn try_sign( & self , msg: & [ u8 ] ) -> :: signature:: Result <#s_ident> {
@@ -99,12 +106,19 @@ fn emit_verifier_impl(input: DeriveInput) -> TokenStream2 {
99106 ) ;
100107
101108 let name = params. name ;
109+ let lifetimes = params. lifetimes ;
102110 let impl_generics = params. impl_generics ;
103111 let ty_generics = params. ty_generics ;
104112 let where_clause = params. where_clause ;
105113
114+ let sep = if lifetimes. is_empty ( ) {
115+ quote ! { }
116+ } else {
117+ quote ! { , }
118+ } ;
119+
106120 quote ! {
107- impl <#( #impl_generics) , * > :: signature:: Verifier <#s_ident> for #name<#( #ty_generics) , * >
121+ impl <#( #lifetimes ) , * #sep # ( # impl_generics) , * > :: signature:: Verifier <#s_ident> for #name<# ( #lifetimes ) , * #sep #( #ty_generics) , * >
108122 #where_clause
109123 {
110124 fn verify( & self , msg: & [ u8 ] , signature: & #s_ident) -> :: signature:: Result <( ) > {
@@ -137,12 +151,19 @@ fn emit_digest_signer_impl(input: DeriveInput) -> TokenStream2 {
137151 ) ;
138152
139153 let name = params. name ;
154+ let lifetimes = params. lifetimes ;
140155 let impl_generics = params. impl_generics ;
141156 let ty_generics = params. ty_generics ;
142157 let where_clause = params. where_clause ;
143158
159+ let sep = if lifetimes. is_empty ( ) {
160+ quote ! { }
161+ } else {
162+ quote ! { , }
163+ } ;
164+
144165 quote ! {
145- impl <#( #impl_generics) , * > :: signature:: DigestSigner <#d_ident, #s_ident> for #name<#( #ty_generics) , * >
166+ impl <#( #lifetimes ) , * #sep # ( # impl_generics) , * > :: signature:: DigestSigner <#d_ident, #s_ident> for #name<# ( #lifetimes ) , * #sep #( #ty_generics) , * >
146167 #where_clause
147168 {
148169 fn try_sign_digest( & self , digest: #d_ident) -> :: signature:: Result <#s_ident> {
@@ -175,12 +196,19 @@ fn emit_digest_verifier_impl(input: DeriveInput) -> TokenStream2 {
175196 ) ;
176197
177198 let name = params. name ;
199+ let lifetimes = params. lifetimes ;
178200 let impl_generics = params. impl_generics ;
179201 let ty_generics = params. ty_generics ;
180202 let where_clause = params. where_clause ;
181203
204+ let sep = if lifetimes. is_empty ( ) {
205+ quote ! { }
206+ } else {
207+ quote ! { , }
208+ } ;
209+
182210 quote ! {
183- impl <#( #impl_generics) , * > :: signature:: DigestVerifier <#d_ident, #s_ident> for #name<#( #ty_generics) , * >
211+ impl <#( #lifetimes ) , * #sep # ( # impl_generics) , * > :: signature:: DigestVerifier <#d_ident, #s_ident> for #name<# ( #lifetimes ) , * #sep #( #ty_generics) , * >
184212 #where_clause
185213 {
186214 fn verify_digest( & self , digest: #d_ident, signature: & #s_ident) -> :: signature:: Result <( ) > {
@@ -195,6 +223,8 @@ struct DeriveParams {
195223 /// Name of the struct the trait impls are being added to.
196224 name : Ident ,
197225
226+ lifetimes : Vec < Lifetime > ,
227+
198228 /// Generic parameters of `impl`.
199229 impl_generics : Vec < TypeParam > ,
200230
@@ -210,6 +240,12 @@ impl DeriveParams {
210240 fn new ( input : DeriveInput ) -> Self {
211241 let impl_generics = input. generics . type_params ( ) . cloned ( ) . collect ( ) ;
212242
243+ let lifetimes = input
244+ . generics
245+ . lifetimes ( )
246+ . map ( |lt| lt. lifetime . clone ( ) )
247+ . collect ( ) ;
248+
213249 let ty_generics = input
214250 . generics
215251 . type_params ( )
@@ -227,6 +263,7 @@ impl DeriveParams {
227263
228264 Self {
229265 name : input. ident ,
266+ lifetimes,
230267 impl_generics,
231268 ty_generics,
232269 where_clause,
@@ -389,4 +426,37 @@ mod tests {
389426 . to_string( )
390427 ) ;
391428 }
429+
430+ #[ test]
431+ fn signer_lifetimes ( ) {
432+ let input = parse_quote ! {
433+ #[ derive( Signer ) ]
434+ struct MySigner <' a, C >
435+ where
436+ C : EllipticCurve
437+ {
438+ scalar: Scalar <C :: ScalarSize >,
439+ _lifetime: & ' a ( ) ,
440+ }
441+ } ;
442+
443+ let output = emit_signer_impl ( input) ;
444+
445+ assert_eq ! (
446+ output. to_string( ) ,
447+ quote! {
448+ impl <' a, C , __S> :: signature:: Signer <__S> for MySigner <' a, C >
449+ where
450+ C : EllipticCurve ,
451+ __S: :: signature:: PrehashSignature ,
452+ Self : :: signature:: DigestSigner <__S:: Digest , __S>
453+ {
454+ fn try_sign( & self , msg: & [ u8 ] ) -> :: signature:: Result <__S> {
455+ self . try_sign_digest( __S:: Digest :: new_with_prefix( msg) )
456+ }
457+ }
458+ }
459+ . to_string( )
460+ ) ;
461+ }
392462}
0 commit comments