@@ -4,6 +4,7 @@ use crate::receiver::{has_self_in_block, has_self_in_sig, mut_pat, ReplaceSelf};
4
4
use proc_macro2:: TokenStream ;
5
5
use quote:: { format_ident, quote, quote_spanned, ToTokens } ;
6
6
use std:: collections:: BTreeSet as Set ;
7
+ use std:: mem;
7
8
use syn:: punctuated:: Punctuated ;
8
9
use syn:: visit_mut:: { self , VisitMut } ;
9
10
use syn:: {
@@ -179,21 +180,29 @@ fn transform_sig(
179
180
}
180
181
}
181
182
182
- for param in & sig. generics . params {
183
+ for param in & mut sig. generics . params {
183
184
match param {
184
185
GenericParam :: Type ( param) => {
185
- let param = & param. ident ;
186
- let span = param. span ( ) ;
186
+ let param_name = & param. ident ;
187
+ let span = match param. colon_token . take ( ) {
188
+ Some ( colon_token) => colon_token. span ,
189
+ None => param_name. span ( ) ,
190
+ } ;
191
+ let bounds = mem:: replace ( & mut param. bounds , Punctuated :: new ( ) ) ;
187
192
where_clause_or_default ( & mut sig. generics . where_clause )
188
193
. predicates
189
- . push ( parse_quote_spanned ! ( span=> #param : ' async_trait) ) ;
194
+ . push ( parse_quote_spanned ! ( span=> #param_name : ' async_trait + #bounds ) ) ;
190
195
}
191
196
GenericParam :: Lifetime ( param) => {
192
- let param = & param. lifetime ;
193
- let span = param. span ( ) ;
197
+ let param_name = & param. lifetime ;
198
+ let span = match param. colon_token . take ( ) {
199
+ Some ( colon_token) => colon_token. span ,
200
+ None => param_name. span ( ) ,
201
+ } ;
202
+ let bounds = mem:: replace ( & mut param. bounds , Punctuated :: new ( ) ) ;
194
203
where_clause_or_default ( & mut sig. generics . where_clause )
195
204
. predicates
196
- . push ( parse_quote_spanned ! ( span=> #param: ' async_trait) ) ;
205
+ . push ( parse_quote_spanned ! ( span=> #param: ' async_trait + #bounds ) ) ;
197
206
}
198
207
GenericParam :: Const ( _) => { }
199
208
}
0 commit comments