@@ -14,8 +14,8 @@ use proc_macro::TokenStream;
14
14
use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
15
15
use quote:: quote;
16
16
use 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 ,
19
19
} ;
20
20
21
21
/// Derive the [`Signer`] trait for a type which impls [`DigestSigner`].
@@ -51,12 +51,19 @@ fn emit_signer_impl(input: DeriveInput) -> TokenStream2 {
51
51
) ;
52
52
53
53
let name = params. name ;
54
+ let lifetimes = params. lifetimes ;
54
55
let impl_generics = params. impl_generics ;
55
56
let ty_generics = params. ty_generics ;
56
57
let where_clause = params. where_clause ;
57
58
59
+ let sep = if lifetimes. is_empty ( ) {
60
+ quote ! { }
61
+ } else {
62
+ quote ! { , }
63
+ } ;
64
+
58
65
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) , * >
60
67
#where_clause
61
68
{
62
69
fn try_sign( & self , msg: & [ u8 ] ) -> :: signature:: Result <#s_ident> {
@@ -99,12 +106,19 @@ fn emit_verifier_impl(input: DeriveInput) -> TokenStream2 {
99
106
) ;
100
107
101
108
let name = params. name ;
109
+ let lifetimes = params. lifetimes ;
102
110
let impl_generics = params. impl_generics ;
103
111
let ty_generics = params. ty_generics ;
104
112
let where_clause = params. where_clause ;
105
113
114
+ let sep = if lifetimes. is_empty ( ) {
115
+ quote ! { }
116
+ } else {
117
+ quote ! { , }
118
+ } ;
119
+
106
120
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) , * >
108
122
#where_clause
109
123
{
110
124
fn verify( & self , msg: & [ u8 ] , signature: & #s_ident) -> :: signature:: Result <( ) > {
@@ -137,12 +151,19 @@ fn emit_digest_signer_impl(input: DeriveInput) -> TokenStream2 {
137
151
) ;
138
152
139
153
let name = params. name ;
154
+ let lifetimes = params. lifetimes ;
140
155
let impl_generics = params. impl_generics ;
141
156
let ty_generics = params. ty_generics ;
142
157
let where_clause = params. where_clause ;
143
158
159
+ let sep = if lifetimes. is_empty ( ) {
160
+ quote ! { }
161
+ } else {
162
+ quote ! { , }
163
+ } ;
164
+
144
165
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) , * >
146
167
#where_clause
147
168
{
148
169
fn try_sign_digest( & self , digest: #d_ident) -> :: signature:: Result <#s_ident> {
@@ -175,12 +196,19 @@ fn emit_digest_verifier_impl(input: DeriveInput) -> TokenStream2 {
175
196
) ;
176
197
177
198
let name = params. name ;
199
+ let lifetimes = params. lifetimes ;
178
200
let impl_generics = params. impl_generics ;
179
201
let ty_generics = params. ty_generics ;
180
202
let where_clause = params. where_clause ;
181
203
204
+ let sep = if lifetimes. is_empty ( ) {
205
+ quote ! { }
206
+ } else {
207
+ quote ! { , }
208
+ } ;
209
+
182
210
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) , * >
184
212
#where_clause
185
213
{
186
214
fn verify_digest( & self , digest: #d_ident, signature: & #s_ident) -> :: signature:: Result <( ) > {
@@ -195,6 +223,8 @@ struct DeriveParams {
195
223
/// Name of the struct the trait impls are being added to.
196
224
name : Ident ,
197
225
226
+ lifetimes : Vec < Lifetime > ,
227
+
198
228
/// Generic parameters of `impl`.
199
229
impl_generics : Vec < TypeParam > ,
200
230
@@ -210,6 +240,12 @@ impl DeriveParams {
210
240
fn new ( input : DeriveInput ) -> Self {
211
241
let impl_generics = input. generics . type_params ( ) . cloned ( ) . collect ( ) ;
212
242
243
+ let lifetimes = input
244
+ . generics
245
+ . lifetimes ( )
246
+ . map ( |lt| lt. lifetime . clone ( ) )
247
+ . collect ( ) ;
248
+
213
249
let ty_generics = input
214
250
. generics
215
251
. type_params ( )
@@ -227,6 +263,7 @@ impl DeriveParams {
227
263
228
264
Self {
229
265
name : input. ident ,
266
+ lifetimes,
230
267
impl_generics,
231
268
ty_generics,
232
269
where_clause,
@@ -389,4 +426,37 @@ mod tests {
389
426
. to_string( )
390
427
) ;
391
428
}
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
+ }
392
462
}
0 commit comments