@@ -32,20 +32,32 @@ impl Parse for Attrs {
3232 }
3333}
3434
35- struct MakeVariant {
36- name : Ident ,
37- #[ allow( unused) ]
38- colon : Token ! [ : ] ,
39- bounds : Punctuated < TraitBound , Plus > ,
35+ enum MakeVariant {
36+ Create {
37+ name : Ident ,
38+ #[ allow( dead_code) ]
39+ colon : Token ! [ : ] ,
40+ bounds : Punctuated < TraitBound , Plus > ,
41+ } ,
42+ Rewrite {
43+ bounds : Punctuated < TraitBound , Plus > ,
44+ } ,
4045}
4146
4247impl Parse for MakeVariant {
4348 fn parse ( input : ParseStream ) -> Result < Self > {
44- Ok ( Self {
45- name : input. parse ( ) ?,
46- colon : input. parse ( ) ?,
47- bounds : input. parse_terminated ( TraitBound :: parse, Token ! [ +] ) ?,
48- } )
49+ let variant = if input. peek ( Ident ) && input. peek2 ( Token ! [ : ] ) {
50+ MakeVariant :: Create {
51+ name : input. parse ( ) ?,
52+ colon : input. parse ( ) ?,
53+ bounds : input. parse_terminated ( TraitBound :: parse, Token ! [ +] ) ?,
54+ }
55+ } else {
56+ MakeVariant :: Rewrite {
57+ bounds : input. parse_terminated ( TraitBound :: parse, Token ! [ +] ) ?,
58+ }
59+ } ;
60+ Ok ( variant)
4961 }
5062}
5163
@@ -56,43 +68,51 @@ pub fn make(
5668 let attrs = parse_macro_input ! ( attr as Attrs ) ;
5769 let item = parse_macro_input ! ( item as ItemTrait ) ;
5870
59- let maybe_allow_async_lint = if attrs
60- . variant
61- . bounds
62- . iter ( )
63- . any ( |b| b. path . segments . last ( ) . unwrap ( ) . ident == "Send" )
64- {
65- quote ! { #[ allow( async_fn_in_trait) ] }
66- } else {
67- quote ! { }
68- } ;
71+ match attrs. variant {
72+ MakeVariant :: Create { name , bounds , .. } => {
73+ let maybe_allow_async_lint = if bounds
74+ . iter ( )
75+ . any ( |b| b. path . segments . last ( ) . unwrap ( ) . ident == "Send" )
76+ {
77+ quote ! { #[ allow( async_fn_in_trait) ] }
78+ } else {
79+ quote ! { }
80+ } ;
6981
70- let variant = mk_variant ( & attrs , & item) ;
71- let blanket_impl = mk_blanket_impl ( & attrs , & item) ;
82+ let variant = mk_variant ( & name , bounds , & item) ;
83+ let blanket_impl = mk_blanket_impl ( & name , & item) ;
7284
73- quote ! {
74- #maybe_allow_async_lint
75- #item
85+ quote ! {
86+ #maybe_allow_async_lint
87+ #item
7688
77- #variant
89+ #variant
7890
79- #blanket_impl
91+ #blanket_impl
92+ }
93+ . into ( )
94+ }
95+ MakeVariant :: Rewrite { bounds, .. } => {
96+ let variant = mk_variant ( & item. ident , bounds, & item) ;
97+ quote ! {
98+ #variant
99+ }
100+ . into ( )
101+ }
80102 }
81- . into ( )
82103}
83104
84- fn mk_variant ( attrs : & Attrs , tr : & ItemTrait ) -> TokenStream {
85- let MakeVariant {
86- ref name,
87- colon : _,
88- ref bounds,
89- } = attrs. variant ;
90- let bounds: Vec < _ > = bounds
105+ fn mk_variant (
106+ variant : & Ident ,
107+ with_bounds : Punctuated < TraitBound , Plus > ,
108+ tr : & ItemTrait ,
109+ ) -> TokenStream {
110+ let bounds: Vec < _ > = with_bounds
91111 . into_iter ( )
92112 . map ( |b| TypeParamBound :: Trait ( b. clone ( ) ) )
93113 . collect ( ) ;
94114 let variant = ItemTrait {
95- ident : name . clone ( ) ,
115+ ident : variant . clone ( ) ,
96116 supertraits : tr. supertraits . iter ( ) . chain ( & bounds) . cloned ( ) . collect ( ) ,
97117 items : tr
98118 . items
@@ -160,9 +180,8 @@ fn transform_item(item: &TraitItem, bounds: &Vec<TypeParamBound>) -> TraitItem {
160180 } )
161181}
162182
163- fn mk_blanket_impl ( attrs : & Attrs , tr : & ItemTrait ) -> TokenStream {
183+ fn mk_blanket_impl ( variant : & Ident , tr : & ItemTrait ) -> TokenStream {
164184 let orig = & tr. ident ;
165- let variant = & attrs. variant . name ;
166185 let ( _impl, orig_ty_generics, _where) = & tr. generics . split_for_impl ( ) ;
167186 let items = tr
168187 . items
0 commit comments