Skip to content

Commit cbf9669

Browse files
committed
Split context lifetimes from sig params loop
1 parent 0b31ad9 commit cbf9669

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

src/expand.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use syn::punctuated::Punctuated;
88
use syn::visit_mut::{self, VisitMut};
99
use syn::{
1010
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,
1313
};
1414

1515
impl ToTokens for Item {
@@ -34,17 +34,18 @@ enum Context<'a> {
3434
}
3535

3636
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> {
3838
let generics = match self {
3939
Context::Trait { generics, .. } => generics,
4040
Context::Impl { impl_generics, .. } => impl_generics,
4141
};
42-
generics.params.iter().filter(move |param| {
42+
generics.params.iter().filter_map(move |param| {
4343
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+
}
4747
}
48+
None
4849
})
4950
}
5051
}
@@ -178,12 +179,7 @@ fn transform_sig(
178179
}
179180
}
180181

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 {
187183
match param {
188184
GenericParam::Type(param) => {
189185
let param = &param.ident;
@@ -203,6 +199,14 @@ fn transform_sig(
203199
}
204200
}
205201

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+
206210
if sig.generics.lt_token.is_none() {
207211
sig.generics.lt_token = Some(Token![<](sig.ident.span()));
208212
}

0 commit comments

Comments
 (0)