@@ -119,20 +119,12 @@ fn derive_clone(ast: &MacroInput) -> Tokens {
119
119
}
120
120
121
121
fn derive_clone_enum ( name : & Ident , typ : Tokens , mut generics : Generics , variants : & [ Variant ] ) -> Tokens {
122
- let variant_idents_values: Vec < _ > = variants. iter ( ) . map ( |variant| {
123
- let has_value =
124
- if let VariantData :: Tuple ( _) = variant. data {
125
- true
126
- }
127
- else {
128
- false
129
- } ;
130
- ( & variant. ident , has_value)
131
- } ) . collect ( ) ;
132
- let variant_patterns = variant_idents_values. iter ( ) . map ( |& ( ref ident, has_value) | {
133
- if has_value {
122
+ let variant_idents_values = gen_idents_count ( variants) ;
123
+ let variant_patterns = variant_idents_values. iter ( ) . map ( |& ( ref ident, value_count) | {
124
+ if value_count > 0 {
125
+ let value_idents = gen_idents ( value_count) ;
134
126
quote ! {
135
- #name:: #ident( ref value )
127
+ #name:: #ident( # ( ref #value_idents ) , * )
136
128
}
137
129
}
138
130
else {
@@ -141,10 +133,11 @@ fn derive_clone_enum(name: &Ident, typ: Tokens, mut generics: Generics, variants
141
133
}
142
134
}
143
135
} ) ;
144
- let variant_values = variant_idents_values. iter ( ) . map ( |& ( ref ident, has_value) | {
145
- if has_value {
136
+ let variant_values = variant_idents_values. iter ( ) . map ( |& ( ref ident, value_count) | {
137
+ if value_count > 0 {
138
+ let value_idents = gen_idents ( value_count) ;
146
139
quote ! {
147
- #name:: #ident( value . clone( ) )
140
+ #name:: #ident( # ( #value_idents . clone( ) ) , * )
148
141
}
149
142
}
150
143
else {
@@ -222,20 +215,12 @@ fn derive_display_variant(ast: &MacroInput) -> Tokens {
222
215
} ;
223
216
224
217
if let Body :: Enum ( ref variants) = ast. body {
225
- let variant_idents_values: Vec < _ > = variants. iter ( ) . map ( |variant| {
226
- let has_value =
227
- if let VariantData :: Tuple ( _) = variant. data {
228
- true
229
- }
230
- else {
231
- false
232
- } ;
233
- ( & variant. ident , has_value)
234
- } ) . collect ( ) ;
235
- let variant_patterns = variant_idents_values. iter ( ) . map ( |& ( ref ident, has_value) | {
236
- if has_value {
218
+ let variant_idents_values = gen_idents_count ( variants) ;
219
+ let variant_patterns = variant_idents_values. iter ( ) . map ( |& ( ref ident, value_count) | {
220
+ let value_idents = gen_ignored_idents ( value_count) ;
221
+ if value_count > 0 {
237
222
quote ! {
238
- #name:: #ident( _ )
223
+ #name:: #ident( # ( #value_idents ) , * )
239
224
}
240
225
}
241
226
else {
@@ -297,3 +282,28 @@ fn remove_generic_bounds(generics: &Generics) -> Generics {
297
282
}
298
283
generics. clone ( )
299
284
}
285
+
286
+ fn gen_ignored_idents ( count : usize ) -> Vec < Ident > {
287
+ ( 0 ..count)
288
+ . map ( |count| Ident :: new ( "_" ) )
289
+ . collect ( )
290
+ }
291
+
292
+ fn gen_idents ( count : usize ) -> Vec < Ident > {
293
+ ( 0 ..count)
294
+ . map ( |count| Ident :: new ( format ! ( "value{}" , count) ) )
295
+ . collect ( )
296
+ }
297
+
298
+ fn gen_idents_count ( variants : & [ Variant ] ) -> Vec < ( & Ident , usize ) > {
299
+ variants. iter ( ) . map ( |variant| {
300
+ let value_count =
301
+ if let VariantData :: Tuple ( ref tuple) = variant. data {
302
+ tuple. len ( )
303
+ }
304
+ else {
305
+ 0
306
+ } ;
307
+ ( & variant. ident , value_count)
308
+ } ) . collect ( )
309
+ }
0 commit comments