@@ -3,6 +3,7 @@ use crate::parse::Item;
33use crate :: receiver:: ReplaceReceiver ;
44use proc_macro2:: { Span , TokenStream } ;
55use quote:: { quote, ToTokens } ;
6+ use std:: mem;
67use syn:: punctuated:: Punctuated ;
78use syn:: visit_mut:: VisitMut ;
89use syn:: {
@@ -28,6 +29,7 @@ enum Context<'a> {
2829 supertraits : & ' a Supertraits ,
2930 } ,
3031 Impl {
32+ impl_generics : & ' a Generics ,
3133 receiver : & ' a Type ,
3234 as_trait : & ' a Path ,
3335 } ,
@@ -57,6 +59,7 @@ pub fn expand(input: &mut Item) {
5759 }
5860 Item :: Impl ( input) => {
5961 let context = Context :: Impl {
62+ impl_generics : & input. generics ,
6063 receiver : & input. self_ty ,
6164 as_trait : & input. trait_ . as_ref ( ) . unwrap ( ) . 1 ,
6265 } ;
@@ -203,12 +206,6 @@ fn transform_sig(context: Context, sig: &mut MethodSig, has_default: bool) {
203206// Pin::from(Box::new(async_trait_method::<T, Self>(self, x)))
204207fn transform_block ( context : Context , sig : & MethodSig , block : & mut Block ) {
205208 let inner = Ident :: new ( & format ! ( "__{}" , sig. ident) , sig. ident . span ( ) ) ;
206- let mut types = sig
207- . decl
208- . generics
209- . type_params ( )
210- . map ( |param| param. ident . clone ( ) )
211- . collect :: < Vec < _ > > ( ) ;
212209 let args = sig
213210 . decl
214211 . inputs
@@ -225,11 +222,35 @@ fn transform_block(context: Context, sig: &MethodSig, block: &mut Block) {
225222
226223 let mut standalone = sig. clone ( ) ;
227224 standalone. ident = inner. clone ( ) ;
225+
226+ let outer_generics = match context {
227+ Context :: Trait { generics, .. } => generics,
228+ Context :: Impl { impl_generics, .. } => impl_generics,
229+ } ;
230+ let fn_generics = mem:: replace ( & mut standalone. decl . generics , outer_generics. clone ( ) ) ;
231+ standalone. decl . generics . params . extend ( fn_generics. params ) ;
232+ if let Some ( where_clause) = fn_generics. where_clause {
233+ standalone
234+ . decl
235+ . generics
236+ . make_where_clause ( )
237+ . predicates
238+ . extend ( where_clause. predicates ) ;
239+ }
240+
228241 standalone
229242 . decl
230243 . generics
231244 . params
232245 . push ( parse_quote ! ( ' async_trait) ) ;
246+
247+ let mut types = standalone
248+ . decl
249+ . generics
250+ . type_params ( )
251+ . map ( |param| param. ident . clone ( ) )
252+ . collect :: < Vec < _ > > ( ) ;
253+
233254 match standalone. decl . inputs . iter_mut ( ) . next ( ) {
234255 Some ( arg @ FnArg :: SelfRef ( _) ) => {
235256 let ( lifetime, mutability) = match arg {
@@ -291,9 +312,9 @@ fn transform_block(context: Context, sig: &MethodSig, block: &mut Block) {
291312
292313 let mut replace = match context {
293314 Context :: Trait { .. } => ReplaceReceiver :: with ( parse_quote ! ( AsyncTrait ) ) ,
294- Context :: Impl { receiver , as_trait } => {
295- ReplaceReceiver :: with_as_trait ( receiver. clone ( ) , as_trait. clone ( ) )
296- }
315+ Context :: Impl {
316+ receiver, as_trait, ..
317+ } => ReplaceReceiver :: with_as_trait ( receiver . clone ( ) , as_trait . clone ( ) ) ,
297318 } ;
298319 replace. visit_method_sig_mut ( & mut standalone) ;
299320 replace. visit_block_mut ( block) ;
0 commit comments