From f388dc55c1d29a8e61b67c79485eaeaeda3d59d2 Mon Sep 17 00:00:00 2001 From: michele Date: Sun, 2 May 2021 17:35:56 +0200 Subject: [PATCH] #98 Refactoring --- src/parse/future.rs | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/parse/future.rs b/src/parse/future.rs index f6e297a..15490fb 100644 --- a/src/parse/future.rs +++ b/src/parse/future.rs @@ -14,21 +14,12 @@ impl ReplaceFutureAttribute { let mut visitor = Self::default(); visitor.visit_item_fn_mut(item_fn); if !visitor.lifetimes.is_empty() { - let mut generics = visitor - .lifetimes - .into_iter() - .map(|lt| { - syn::GenericParam::Lifetime(syn::LifetimeDef { - lifetime: lt, - attrs: Default::default(), - colon_token: None, - bounds: Default::default(), - }) - }) - .collect::>(); - generics.extend(item_fn.sig.generics.params.iter().cloned()); + let all = visitor.lifetimes + .iter() + .map(|lt| lt as &dyn ToTokens) + .chain(item_fn.sig.generics.params.iter().map(|gp| gp as &dyn ToTokens)); item_fn.sig.generics = parse_quote! { - <#(#generics),*> + <#(#all),*> }; } if visitor.errors.is_empty() { @@ -39,15 +30,20 @@ impl ReplaceFutureAttribute { } } +fn extract_arg_attributes(node: &mut syn::PatType, predicate: fn(a: &syn::Attribute) -> bool) -> Vec { + let attrs = std::mem::take(&mut node.attrs); + let (extracted, attrs): (Vec<_>, Vec<_>) = + attrs.into_iter().partition(predicate); + node.attrs = attrs; + extracted +} + impl VisitMut for ReplaceFutureAttribute { fn visit_fn_arg_mut(&mut self, node: &mut FnArg) { let ident = node.maybe_ident().cloned().unwrap(); match node { FnArg::Typed(t) => { - let attrs = std::mem::take(&mut t.attrs); - let (futures, attrs): (Vec<_>, Vec<_>) = - attrs.into_iter().partition(|a| attr_is(a, "future")); - t.attrs = attrs; + let futures = extract_arg_attributes(t, |a| attr_is(a, "future")); if futures.is_empty() { return; } else if futures.len() > 1 {