@@ -68,24 +68,8 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
68
68
. traits
69
69
. iter ( )
70
70
. map ( |attr| {
71
- let mut new_trait = ItemTrait {
72
- attrs : Vec :: new ( ) ,
73
- ident : attr. subtrait_name . clone ( ) ,
74
- items : Vec :: new ( ) ,
75
- ..tr. clone ( )
76
- } ;
77
- new_trait
78
- . supertraits
79
- . push ( syn:: TypeParamBound :: Trait ( TraitBound {
80
- paren_token : None ,
81
- modifier : TraitBoundModifier :: None ,
82
- lifetimes : None ,
83
- path : attr. subtrait . clone ( ) ,
84
- } ) ) ;
85
- let where_clause = new_trait. generics . make_where_clause ( ) ;
86
-
87
71
let subtrait = & attr. subtrait ;
88
- for item in tr. items . iter ( ) {
72
+ let fn_bounds = tr. items . iter ( ) . filter_map ( |item| {
89
73
match item {
90
74
TraitItem :: Fn ( item_fn) => {
91
75
let is_async = item_fn. sig . asyncness . is_some ( ) ;
@@ -98,20 +82,34 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
98
82
99
83
if is_async || returns_impl_trait {
100
84
let name = & item_fn. sig . ident ;
101
- where_clause
102
- . predicates
103
- . push ( WherePredicate :: Type ( PredicateType {
104
- lifetimes : None ,
105
- bounded_ty : Type :: Verbatim ( quote ! ( Self :: #name( ) ) ) ,
106
- colon_token : Token ! [ : ] ( Span :: call_site ( ) ) ,
107
- bounds : parse_quote ! ( #subtrait) ,
108
- } ) ) ;
85
+ return Some ( quote ! { #name( ) : #subtrait } ) ;
109
86
}
110
87
}
111
88
_ => ( ) ,
112
89
}
90
+ None
91
+ } ) ;
92
+
93
+ let tr_ident = & tr. ident ;
94
+ let supertrait = syn:: TypeParamBound :: Verbatim ( quote ! {
95
+ #tr_ident<#( #fn_bounds) , * >
96
+ } ) ;
97
+
98
+ ItemTrait {
99
+ attrs : Vec :: new ( ) ,
100
+ ident : attr. subtrait_name . clone ( ) ,
101
+ items : Vec :: new ( ) ,
102
+ supertraits : Punctuated :: from_iter ( vec ! [
103
+ supertrait,
104
+ syn:: TypeParamBound :: Trait ( TraitBound {
105
+ paren_token: None ,
106
+ modifier: TraitBoundModifier :: None ,
107
+ lifetimes: None ,
108
+ path: attr. subtrait. clone( ) ,
109
+ } ) ,
110
+ ] . into_iter ( ) ) ,
111
+ ..tr. clone ( )
113
112
}
114
- new_trait
115
113
} )
116
114
. collect :: < Vec < _ > > ( ) ;
117
115
0 commit comments