@@ -68,24 +68,8 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
6868 . traits
6969 . iter ( )
7070 . 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-
8771 let subtrait = & attr. subtrait ;
88- for item in tr. items . iter ( ) {
72+ let fn_bounds = tr. items . iter ( ) . filter_map ( |item| {
8973 match item {
9074 TraitItem :: Fn ( item_fn) => {
9175 let is_async = item_fn. sig . asyncness . is_some ( ) ;
@@ -98,20 +82,34 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
9882
9983 if is_async || returns_impl_trait {
10084 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 } ) ;
10986 }
11087 }
11188 _ => ( ) ,
11289 }
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 ( )
113112 }
114- new_trait
115113 } )
116114 . collect :: < Vec < _ > > ( ) ;
117115
0 commit comments