@@ -119,20 +119,12 @@ fn derive_clone(ast: &MacroInput) -> Tokens {
119119}
120120
121121fn 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) ;
134126 quote ! {
135- #name:: #ident( ref value )
127+ #name:: #ident( # ( ref #value_idents ) , * )
136128 }
137129 }
138130 else {
@@ -141,10 +133,11 @@ fn derive_clone_enum(name: &Ident, typ: Tokens, mut generics: Generics, variants
141133 }
142134 }
143135 } ) ;
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) ;
146139 quote ! {
147- #name:: #ident( value . clone( ) )
140+ #name:: #ident( # ( #value_idents . clone( ) ) , * )
148141 }
149142 }
150143 else {
@@ -222,20 +215,12 @@ fn derive_display_variant(ast: &MacroInput) -> Tokens {
222215 } ;
223216
224217 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 {
237222 quote ! {
238- #name:: #ident( _ )
223+ #name:: #ident( # ( #value_idents ) , * )
239224 }
240225 }
241226 else {
@@ -297,3 +282,28 @@ fn remove_generic_bounds(generics: &Generics) -> Generics {
297282 }
298283 generics. clone ( )
299284}
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