Skip to content

Commit c83613c

Browse files
committed
Combine generic parameters from enclosing block
1 parent deee79d commit c83613c

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

src/expand.rs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::parse::Item;
33
use crate::receiver::ReplaceReceiver;
44
use proc_macro2::{Span, TokenStream};
55
use quote::{quote, ToTokens};
6+
use std::mem;
67
use syn::punctuated::Punctuated;
78
use syn::visit_mut::VisitMut;
89
use 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)))
204207
fn 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

Comments
 (0)