@@ -3,6 +3,7 @@ use crate::parse::Item;
3
3
use crate :: receiver:: ReplaceReceiver ;
4
4
use proc_macro2:: { Span , TokenStream } ;
5
5
use quote:: { quote, ToTokens } ;
6
+ use std:: mem;
6
7
use syn:: punctuated:: Punctuated ;
7
8
use syn:: visit_mut:: VisitMut ;
8
9
use syn:: {
@@ -28,6 +29,7 @@ enum Context<'a> {
28
29
supertraits : & ' a Supertraits ,
29
30
} ,
30
31
Impl {
32
+ impl_generics : & ' a Generics ,
31
33
receiver : & ' a Type ,
32
34
as_trait : & ' a Path ,
33
35
} ,
@@ -57,6 +59,7 @@ pub fn expand(input: &mut Item) {
57
59
}
58
60
Item :: Impl ( input) => {
59
61
let context = Context :: Impl {
62
+ impl_generics : & input. generics ,
60
63
receiver : & input. self_ty ,
61
64
as_trait : & input. trait_ . as_ref ( ) . unwrap ( ) . 1 ,
62
65
} ;
@@ -203,12 +206,6 @@ fn transform_sig(context: Context, sig: &mut MethodSig, has_default: bool) {
203
206
// Pin::from(Box::new(async_trait_method::<T, Self>(self, x)))
204
207
fn transform_block ( context : Context , sig : & MethodSig , block : & mut Block ) {
205
208
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 < _ > > ( ) ;
212
209
let args = sig
213
210
. decl
214
211
. inputs
@@ -225,11 +222,35 @@ fn transform_block(context: Context, sig: &MethodSig, block: &mut Block) {
225
222
226
223
let mut standalone = sig. clone ( ) ;
227
224
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
+
228
241
standalone
229
242
. decl
230
243
. generics
231
244
. params
232
245
. 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
+
233
254
match standalone. decl . inputs . iter_mut ( ) . next ( ) {
234
255
Some ( arg @ FnArg :: SelfRef ( _) ) => {
235
256
let ( lifetime, mutability) = match arg {
@@ -291,9 +312,9 @@ fn transform_block(context: Context, sig: &MethodSig, block: &mut Block) {
291
312
292
313
let mut replace = match context {
293
314
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 ( ) ) ,
297
318
} ;
298
319
replace. visit_method_sig_mut ( & mut standalone) ;
299
320
replace. visit_block_mut ( block) ;
0 commit comments