Skip to content

Commit

Permalink
Split context lifetimes from sig params loop
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Mar 25, 2022
1 parent 0b31ad9 commit cbf9669
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions src/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ use syn::punctuated::Punctuated;
use syn::visit_mut::{self, VisitMut};
use syn::{
parse_quote, parse_quote_spanned, Attribute, Block, FnArg, GenericParam, Generics, Ident,
ImplItem, Lifetime, Pat, PatIdent, Receiver, ReturnType, Signature, Stmt, Token, TraitItem,
Type, TypeParamBound, TypePath, WhereClause,
ImplItem, Lifetime, LifetimeDef, Pat, PatIdent, Receiver, ReturnType, Signature, Stmt, Token,
TraitItem, Type, TypeParamBound, TypePath, WhereClause,
};

impl ToTokens for Item {
Expand All @@ -34,17 +34,18 @@ enum Context<'a> {
}

impl Context<'_> {
fn lifetimes<'a>(&'a self, used: &'a [Lifetime]) -> impl Iterator<Item = &'a GenericParam> {
fn lifetimes<'a>(&'a self, used: &'a [Lifetime]) -> impl Iterator<Item = &'a LifetimeDef> {
let generics = match self {
Context::Trait { generics, .. } => generics,
Context::Impl { impl_generics, .. } => impl_generics,
};
generics.params.iter().filter(move |param| {
generics.params.iter().filter_map(move |param| {
if let GenericParam::Lifetime(param) = param {
used.contains(&param.lifetime)
} else {
false
if used.contains(&param.lifetime) {
return Some(param);
}
}
None
})
}
}
Expand Down Expand Up @@ -178,12 +179,7 @@ fn transform_sig(
}
}

for param in sig
.generics
.params
.iter()
.chain(context.lifetimes(&lifetimes.explicit))
{
for param in &sig.generics.params {
match param {
GenericParam::Type(param) => {
let param = &param.ident;
Expand All @@ -203,6 +199,14 @@ fn transform_sig(
}
}

for param in context.lifetimes(&lifetimes.explicit) {
let param = &param.lifetime;
let span = param.span();
where_clause_or_default(&mut sig.generics.where_clause)
.predicates
.push(parse_quote_spanned!(span=> #param: 'async_trait));
}

if sig.generics.lt_token.is_none() {
sig.generics.lt_token = Some(Token![<](sig.ident.span()));
}
Expand Down

0 comments on commit cbf9669

Please sign in to comment.