@@ -99,22 +99,61 @@ fn expand(cx: ext_ctxt,
99
99
do vec:: flat_map ( in_items) |item| {
100
100
match item. node {
101
101
ast:: item_ty( @{ node: ast:: ty_rec( fields) , _} , tps) => {
102
- vec:: append (
103
- ~[ filter_attrs ( * item) ] ,
104
- mk_rec_impl ( cx, item. span , item. ident , fields, tps)
105
- )
102
+ let ser_impl = mk_rec_ser_impl (
103
+ cx,
104
+ item. span ,
105
+ item. ident ,
106
+ fields,
107
+ tps
108
+ ) ;
109
+
110
+ let deser_impl = mk_rec_deser_impl (
111
+ cx,
112
+ item. span ,
113
+ item. ident ,
114
+ fields,
115
+ tps
116
+ ) ;
117
+
118
+ ~[ filter_attrs ( * item) , ser_impl, deser_impl]
106
119
} ,
107
120
ast:: item_class( @{ fields, _} , tps) => {
108
- vec:: append (
109
- ~[ filter_attrs ( * item) ] ,
110
- mk_struct_impl ( cx, item. span , item. ident , fields, tps)
111
- )
121
+ let ser_impl = mk_struct_ser_impl (
122
+ cx,
123
+ item. span ,
124
+ item. ident ,
125
+ fields,
126
+ tps
127
+ ) ;
128
+
129
+ let deser_impl = mk_struct_deser_impl (
130
+ cx,
131
+ item. span ,
132
+ item. ident ,
133
+ fields,
134
+ tps
135
+ ) ;
136
+
137
+ ~[ filter_attrs ( * item) , ser_impl, deser_impl]
112
138
} ,
113
139
ast:: item_enum( enum_def, tps) => {
114
- vec:: append (
115
- ~[ filter_attrs ( * item) ] ,
116
- mk_enum_impl ( cx, item. span , item. ident , enum_def, tps)
117
- )
140
+ let ser_impl = mk_enum_ser_impl (
141
+ cx,
142
+ item. span ,
143
+ item. ident ,
144
+ enum_def,
145
+ tps
146
+ ) ;
147
+
148
+ let deser_impl = mk_enum_deser_impl (
149
+ cx,
150
+ item. span ,
151
+ item. ident ,
152
+ enum_def,
153
+ tps
154
+ ) ;
155
+
156
+ ~[ filter_attrs ( * item) , ser_impl, deser_impl]
118
157
} ,
119
158
_ => {
120
159
cx. span_err ( span, ~"#[ auto_serialize2] can only be applied \
@@ -396,30 +435,40 @@ fn mk_deser_method(
396
435
}
397
436
}
398
437
399
- fn mk_rec_impl (
438
+ fn mk_rec_ser_impl (
400
439
cx : ext_ctxt ,
401
440
span : span ,
402
441
ident : ast:: ident ,
403
442
fields : ~[ ast:: ty_field ] ,
404
443
tps : ~[ ast:: ty_param ]
405
- ) -> ~[ @ast:: item ] {
406
- let fields = mk_rec_fields ( fields) ;
407
- let ser_fields = mk_ser_fields ( cx, span, fields) ;
408
- let deser_fields = mk_deser_fields ( cx, span, fields) ;
444
+ ) -> @ast:: item {
445
+ let fields = mk_ser_fields ( cx, span, mk_rec_fields ( fields) ) ;
409
446
410
- // ast for `__s.emit_rec(|| $(ser_fields ))`
411
- let ser_body = cx. expr_call (
447
+ // ast for `__s.emit_rec(|| $(fields ))`
448
+ let body = cx. expr_call (
412
449
span,
413
450
cx. expr_field (
414
451
span,
415
452
cx. expr_var ( span, ~"__s") ,
416
453
cx. ident_of ( ~"emit_rec")
417
454
) ,
418
- ~[ cx. lambda_stmts ( span, ser_fields ) ]
455
+ ~[ cx. lambda_stmts ( span, fields ) ]
419
456
) ;
420
457
421
- // ast for `read_rec(|| $(deser_fields))`
422
- let deser_body = cx. expr_call (
458
+ mk_ser_impl ( cx, span, ident, tps, body)
459
+ }
460
+
461
+ fn mk_rec_deser_impl (
462
+ cx : ext_ctxt ,
463
+ span : span ,
464
+ ident : ast:: ident ,
465
+ fields : ~[ ast:: ty_field ] ,
466
+ tps : ~[ ast:: ty_param ]
467
+ ) -> @ast:: item {
468
+ let fields = mk_deser_fields ( cx, span, mk_rec_fields ( fields) ) ;
469
+
470
+ // ast for `read_rec(|| $(fields))`
471
+ let body = cx. expr_call (
423
472
span,
424
473
cx. expr_field (
425
474
span,
@@ -430,30 +479,25 @@ fn mk_rec_impl(
430
479
cx. lambda_expr (
431
480
cx. expr (
432
481
span,
433
- ast:: expr_rec ( deser_fields , None )
482
+ ast:: expr_rec ( fields , None )
434
483
)
435
484
)
436
485
]
437
486
) ;
438
487
439
- ~[
440
- mk_ser_impl ( cx, span, ident, tps, ser_body) ,
441
- mk_deser_impl ( cx, span, ident, tps, deser_body) ,
442
- ]
488
+ mk_deser_impl ( cx, span, ident, tps, body)
443
489
}
444
490
445
- fn mk_struct_impl (
491
+ fn mk_struct_ser_impl (
446
492
cx : ext_ctxt ,
447
493
span : span ,
448
494
ident : ast:: ident ,
449
495
fields : ~[ @ast:: struct_field ] ,
450
496
tps : ~[ ast:: ty_param ]
451
- ) -> ~[ @ast:: item ] {
452
- let fields = mk_struct_fields ( fields) ;
453
- let ser_fields = mk_ser_fields ( cx, span, fields) ;
454
- let deser_fields = mk_deser_fields ( cx, span, fields) ;
497
+ ) -> @ast:: item {
498
+ let fields = mk_ser_fields ( cx, span, mk_struct_fields ( fields) ) ;
455
499
456
- // ast for `__s.emit_struct($(name), || $(ser_fields ))`
500
+ // ast for `__s.emit_struct($(name), || $(fields ))`
457
501
let ser_body = cx. expr_call (
458
502
span,
459
503
cx. expr_field (
@@ -463,12 +507,24 @@ fn mk_struct_impl(
463
507
) ,
464
508
~[
465
509
cx. lit_str ( span, @cx. str_of ( ident) ) ,
466
- cx. lambda_stmts ( span, ser_fields ) ,
510
+ cx. lambda_stmts ( span, fields ) ,
467
511
]
468
512
) ;
469
513
470
- // ast for `read_struct($(name), || $(deser_fields))`
471
- let deser_body = cx. expr_call (
514
+ mk_ser_impl ( cx, span, ident, tps, ser_body)
515
+ }
516
+
517
+ fn mk_struct_deser_impl (
518
+ cx : ext_ctxt ,
519
+ span : span ,
520
+ ident : ast:: ident ,
521
+ fields : ~[ @ast:: struct_field ] ,
522
+ tps : ~[ ast:: ty_param ]
523
+ ) -> @ast:: item {
524
+ let fields = mk_deser_fields ( cx, span, mk_struct_fields ( fields) ) ;
525
+
526
+ // ast for `read_struct($(name), || $(fields))`
527
+ let body = cx. expr_call (
472
528
span,
473
529
cx. expr_field (
474
530
span,
@@ -478,23 +534,19 @@ fn mk_struct_impl(
478
534
~[
479
535
cx. lit_str ( span, @cx. str_of ( ident) ) ,
480
536
cx. lambda_expr (
481
- span,
482
537
cx. expr (
483
538
span,
484
539
ast:: expr_struct (
485
540
cx. path ( span, ~[ ident] ) ,
486
- deser_fields
541
+ fields ,
487
542
None
488
543
)
489
544
)
490
545
) ,
491
546
]
492
- )
547
+ ) ;
493
548
494
- ~[
495
- mk_ser_impl ( cx, span, ident, tps, ser_body) ,
496
- mk_deser_impl ( cx, span, ident, tps, deser_body) ,
497
- ]
549
+ mk_deser_impl ( cx, span, ident, tps, body)
498
550
}
499
551
500
552
// Records and structs don't have the same fields types, but they share enough
@@ -576,10 +628,9 @@ fn mk_ser_fields(
576
628
fn mk_deser_fields (
577
629
cx : ext_ctxt ,
578
630
span : span ,
579
- fields : ~[ { span : span , ident : ast:: ident , mutbl : ast:: mutability } ] ,
580
- f : fn ( ~[ ast:: field ] ) -> @ast:: expr
581
- ) -> @ast:: expr {
582
- let fields = do fields. mapi |idx, field| {
631
+ fields : ~[ { span : span , ident : ast:: ident , mutbl : ast:: mutability } ]
632
+ ) -> ~[ ast:: field ] {
633
+ do fields. mapi |idx, field| {
583
634
// ast for `|| std::serialization2::deserialize(__d)`
584
635
let expr_lambda = cx. lambda (
585
636
cx. expr_blk (
@@ -614,45 +665,41 @@ fn mk_deser_fields(
614
665
node : { mutbl : field. mutbl , ident : field. ident , expr : expr } ,
615
666
span: span,
616
667
}
617
- } ;
618
-
619
- // ast for `__d.read_rec(|| $(fields_expr))`
620
- cx. expr_call (
621
- span,
622
- cx. expr_field (
623
- span,
624
- cx. expr_var ( span, ~"__d") ,
625
- cx. ident_of ( ~"read_rec")
626
- ) ,
627
- ~[ cx. lambda_expr ( f ( fields) ) ]
628
- )
668
+ }
629
669
}
630
670
631
- fn mk_enum_impl (
671
+ fn mk_enum_ser_impl (
632
672
cx : ext_ctxt ,
633
673
span : span ,
634
674
ident : ast:: ident ,
635
675
enum_def : ast:: enum_def ,
636
676
tps : ~[ ast:: ty_param ]
637
- ) -> ~ [ @ast:: item ] {
638
- let ser_body = mk_enum_ser_body (
677
+ ) -> @ast:: item {
678
+ let body = mk_enum_ser_body (
639
679
cx,
640
680
span,
641
681
ident,
642
682
enum_def. variants
643
683
) ;
644
684
645
- let deser_body = mk_enum_deser_body (
685
+ mk_ser_impl ( cx, span, ident, tps, body)
686
+ }
687
+
688
+ fn mk_enum_deser_impl (
689
+ cx : ext_ctxt ,
690
+ span : span ,
691
+ ident : ast:: ident ,
692
+ enum_def : ast:: enum_def ,
693
+ tps : ~[ ast:: ty_param ]
694
+ ) -> @ast:: item {
695
+ let body = mk_enum_deser_body (
646
696
cx,
647
697
span,
648
698
ident,
649
699
enum_def. variants
650
700
) ;
651
701
652
- ~[
653
- mk_ser_impl ( cx, span, ident, tps, ser_body) ,
654
- mk_deser_impl ( cx, span, ident, tps, deser_body) ,
655
- ]
702
+ mk_deser_impl ( cx, span, ident, tps, body)
656
703
}
657
704
658
705
fn ser_variant (
0 commit comments