@@ -32,20 +32,32 @@ impl Parse for Attrs {
32
32
}
33
33
}
34
34
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
+ } ,
40
45
}
41
46
42
47
impl Parse for MakeVariant {
43
48
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)
49
61
}
50
62
}
51
63
@@ -56,43 +68,51 @@ pub fn make(
56
68
let attrs = parse_macro_input ! ( attr as Attrs ) ;
57
69
let item = parse_macro_input ! ( item as ItemTrait ) ;
58
70
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
+ } ;
69
81
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) ;
72
84
73
- quote ! {
74
- #maybe_allow_async_lint
75
- #item
85
+ quote ! {
86
+ #maybe_allow_async_lint
87
+ #item
76
88
77
- #variant
89
+ #variant
78
90
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
+ }
80
102
}
81
- . into ( )
82
103
}
83
104
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
91
111
. into_iter ( )
92
112
. map ( |b| TypeParamBound :: Trait ( b. clone ( ) ) )
93
113
. collect ( ) ;
94
114
let variant = ItemTrait {
95
- ident : name . clone ( ) ,
115
+ ident : variant . clone ( ) ,
96
116
supertraits : tr. supertraits . iter ( ) . chain ( & bounds) . cloned ( ) . collect ( ) ,
97
117
items : tr
98
118
. items
@@ -160,9 +180,8 @@ fn transform_item(item: &TraitItem, bounds: &Vec<TypeParamBound>) -> TraitItem {
160
180
} )
161
181
}
162
182
163
- fn mk_blanket_impl ( attrs : & Attrs , tr : & ItemTrait ) -> TokenStream {
183
+ fn mk_blanket_impl ( variant : & Ident , tr : & ItemTrait ) -> TokenStream {
164
184
let orig = & tr. ident ;
165
- let variant = & attrs. variant . name ;
166
185
let ( _impl, orig_ty_generics, _where) = & tr. generics . split_for_impl ( ) ;
167
186
let items = tr
168
187
. items
0 commit comments