@@ -8,8 +8,8 @@ use syn::punctuated::Punctuated;
8
8
use syn:: visit_mut:: { self , VisitMut } ;
9
9
use syn:: {
10
10
parse_quote, parse_quote_spanned, Attribute , Block , FnArg , GenericParam , Generics , Ident ,
11
- ImplItem , Lifetime , Pat , PatIdent , Receiver , ReturnType , Signature , Stmt , Token , TraitItem ,
12
- Type , TypeParamBound , TypePath , WhereClause ,
11
+ ImplItem , Lifetime , LifetimeDef , Pat , PatIdent , Receiver , ReturnType , Signature , Stmt , Token ,
12
+ TraitItem , Type , TypeParamBound , TypePath , WhereClause ,
13
13
} ;
14
14
15
15
impl ToTokens for Item {
@@ -34,17 +34,18 @@ enum Context<'a> {
34
34
}
35
35
36
36
impl Context < ' _ > {
37
- fn lifetimes < ' a > ( & ' a self , used : & ' a [ Lifetime ] ) -> impl Iterator < Item = & ' a GenericParam > {
37
+ fn lifetimes < ' a > ( & ' a self , used : & ' a [ Lifetime ] ) -> impl Iterator < Item = & ' a LifetimeDef > {
38
38
let generics = match self {
39
39
Context :: Trait { generics, .. } => generics,
40
40
Context :: Impl { impl_generics, .. } => impl_generics,
41
41
} ;
42
- generics. params . iter ( ) . filter ( move |param| {
42
+ generics. params . iter ( ) . filter_map ( move |param| {
43
43
if let GenericParam :: Lifetime ( param) = param {
44
- used. contains ( & param. lifetime )
45
- } else {
46
- false
44
+ if used. contains ( & param. lifetime ) {
45
+ return Some ( param ) ;
46
+ }
47
47
}
48
+ None
48
49
} )
49
50
}
50
51
}
@@ -178,12 +179,7 @@ fn transform_sig(
178
179
}
179
180
}
180
181
181
- for param in sig
182
- . generics
183
- . params
184
- . iter ( )
185
- . chain ( context. lifetimes ( & lifetimes. explicit ) )
186
- {
182
+ for param in & sig. generics . params {
187
183
match param {
188
184
GenericParam :: Type ( param) => {
189
185
let param = & param. ident ;
@@ -203,6 +199,14 @@ fn transform_sig(
203
199
}
204
200
}
205
201
202
+ for param in context. lifetimes ( & lifetimes. explicit ) {
203
+ let param = & param. lifetime ;
204
+ let span = param. span ( ) ;
205
+ where_clause_or_default ( & mut sig. generics . where_clause )
206
+ . predicates
207
+ . push ( parse_quote_spanned ! ( span=> #param: ' async_trait) ) ;
208
+ }
209
+
206
210
if sig. generics . lt_token . is_none ( ) {
207
211
sig. generics . lt_token = Some ( Token ! [ <] ( sig. ident . span ( ) ) ) ;
208
212
}
0 commit comments