@@ -130,20 +130,6 @@ fn expand_auto_encode(
130
130
do vec:: flat_map ( in_items) |item| {
131
131
if item. attrs . any ( is_auto_encode) {
132
132
match item. node {
133
- ast:: item_ty(
134
- @ast:: Ty { node : ast:: ty_rec( ref fields) , _} ,
135
- tps
136
- ) => {
137
- let ser_impl = mk_rec_ser_impl (
138
- cx,
139
- item. span ,
140
- item. ident ,
141
- ( * fields) ,
142
- tps
143
- ) ;
144
-
145
- ~[ filter_attrs ( * item) , ser_impl]
146
- } ,
147
133
ast:: item_struct( @ast:: struct_def { fields, _} , tps) => {
148
134
let ser_impl = mk_struct_ser_impl (
149
135
cx,
@@ -199,20 +185,6 @@ fn expand_auto_decode(
199
185
do vec:: flat_map ( in_items) |item| {
200
186
if item. attrs . any ( is_auto_decode) {
201
187
match item. node {
202
- ast:: item_ty(
203
- @ast:: Ty { node : ast:: ty_rec( ref fields) , _} ,
204
- tps
205
- ) => {
206
- let deser_impl = mk_rec_deser_impl (
207
- cx,
208
- item. span ,
209
- item. ident ,
210
- ( * fields) ,
211
- tps
212
- ) ;
213
-
214
- ~[ filter_attrs ( * item) , deser_impl]
215
- } ,
216
188
ast:: item_struct( @ast:: struct_def { fields, _} , tps) => {
217
189
let deser_impl = mk_struct_deser_impl (
218
190
cx,
@@ -693,67 +665,48 @@ fn mk_deser_method(
693
665
}
694
666
}
695
667
696
- fn mk_rec_ser_impl (
697
- cx : ext_ctxt ,
698
- span : span ,
699
- ident : ast:: ident ,
700
- fields : ~[ ast:: ty_field ] ,
701
- tps : ~[ ast:: ty_param ]
702
- ) -> @ast:: item {
703
- let fields = mk_ser_fields ( cx, span, mk_rec_fields ( fields) ) ;
704
-
705
- // ast for `__s.emit_rec(|| $(fields))`
706
- let body = cx. expr_call (
707
- span,
708
- cx. expr_field (
709
- span,
710
- cx. expr_var ( span, ~"__s") ,
711
- cx. ident_of ( ~"emit_rec")
712
- ) ,
713
- ~[ cx. lambda_stmts ( span, fields) ]
714
- ) ;
715
-
716
- mk_ser_impl ( cx, span, ident, tps, body)
717
- }
718
-
719
- fn mk_rec_deser_impl (
668
+ fn mk_struct_ser_impl (
720
669
cx : ext_ctxt ,
721
670
span : span ,
722
671
ident : ast:: ident ,
723
- fields : ~[ ast:: ty_field ] ,
672
+ fields : ~[ @ ast:: struct_field ] ,
724
673
tps : ~[ ast:: ty_param ]
725
674
) -> @ast:: item {
726
- let fields = mk_deser_fields ( cx, span, mk_rec_fields ( fields) ) ;
727
-
728
- // ast for `read_rec(|| $(fields))`
729
- let body = cx. expr_call (
730
- span,
731
- cx. expr_field (
732
- span,
733
- cx. expr_var ( span, ~"__d") ,
734
- cx. ident_of ( ~"read_rec")
735
- ) ,
736
- ~[
737
- cx. lambda_expr (
738
- cx. expr (
675
+ let fields = do mk_struct_fields ( fields) . mapi |idx, field| {
676
+ // ast for `|| self.$(name).encode(__s)`
677
+ let expr_lambda = cx. lambda_expr (
678
+ cx. expr_call (
679
+ span,
680
+ cx. expr_field (
739
681
span,
740
- ast:: expr_rec ( fields, None )
741
- )
682
+ cx. expr_field (
683
+ span,
684
+ cx. expr_var ( span, ~"self ") ,
685
+ field. ident
686
+ ) ,
687
+ cx. ident_of ( ~"encode")
688
+ ) ,
689
+ ~[ cx. expr_var ( span, ~"__s") ]
742
690
)
743
- ]
744
- ) ;
745
-
746
- mk_deser_impl ( cx, span, ident, tps, body)
747
- }
691
+ ) ;
748
692
749
- fn mk_struct_ser_impl (
750
- cx : ext_ctxt ,
751
- span : span ,
752
- ident : ast:: ident ,
753
- fields : ~[ @ast:: struct_field ] ,
754
- tps : ~[ ast:: ty_param ]
755
- ) -> @ast:: item {
756
- let fields = mk_ser_fields ( cx, span, mk_struct_fields ( fields) ) ;
693
+ // ast for `__s.emit_field($(name), $(idx), $(expr_lambda))`
694
+ cx. stmt (
695
+ cx. expr_call (
696
+ span,
697
+ cx. expr_field (
698
+ span,
699
+ cx. expr_var ( span, ~"__s") ,
700
+ cx. ident_of ( ~"emit_field")
701
+ ) ,
702
+ ~[
703
+ cx. lit_str ( span, @cx. str_of ( field. ident ) ) ,
704
+ cx. lit_uint ( span, idx) ,
705
+ expr_lambda,
706
+ ]
707
+ )
708
+ )
709
+ } ;
757
710
758
711
// ast for `__s.emit_struct($(name), || $(fields))`
759
712
let ser_body = cx. expr_call (
@@ -780,7 +733,47 @@ fn mk_struct_deser_impl(
780
733
fields : ~[ @ast:: struct_field ] ,
781
734
tps : ~[ ast:: ty_param ]
782
735
) -> @ast:: item {
783
- let fields = mk_deser_fields ( cx, span, mk_struct_fields ( fields) ) ;
736
+ let fields = do mk_struct_fields ( fields) . mapi |idx, field| {
737
+ // ast for `|| std::serialize::decode(__d)`
738
+ let expr_lambda = cx. lambda (
739
+ cx. expr_blk (
740
+ cx. expr_call (
741
+ span,
742
+ cx. expr_path_global ( span, ~[
743
+ cx. ident_of ( ~"std") ,
744
+ cx. ident_of ( ~"serialize") ,
745
+ cx. ident_of ( ~"Decodable ") ,
746
+ cx. ident_of ( ~"decode") ,
747
+ ] ) ,
748
+ ~[ cx. expr_var ( span, ~"__d") ]
749
+ )
750
+ )
751
+ ) ;
752
+
753
+ // ast for `__d.read_field($(name), $(idx), $(expr_lambda))`
754
+ let expr: @ast:: expr = cx. expr_call (
755
+ span,
756
+ cx. expr_field (
757
+ span,
758
+ cx. expr_var ( span, ~"__d") ,
759
+ cx. ident_of ( ~"read_field")
760
+ ) ,
761
+ ~[
762
+ cx. lit_str ( span, @cx. str_of ( field. ident ) ) ,
763
+ cx. lit_uint ( span, idx) ,
764
+ expr_lambda,
765
+ ]
766
+ ) ;
767
+
768
+ ast:: spanned {
769
+ node : ast:: field_ {
770
+ mutbl : field. mutbl ,
771
+ ident : field. ident ,
772
+ expr : expr,
773
+ } ,
774
+ span : span,
775
+ }
776
+ } ;
784
777
785
778
// ast for `read_struct($(name), || $(fields))`
786
779
let body = cx. expr_call (
@@ -818,16 +811,6 @@ struct field {
818
811
mutbl : ast:: mutability ,
819
812
}
820
813
821
- fn mk_rec_fields ( fields : ~[ ast:: ty_field ] ) -> ~[ field ] {
822
- do fields. map |field| {
823
- field {
824
- span : field. span ,
825
- ident : field. node . ident ,
826
- mutbl : field. node . mt . mutbl ,
827
- }
828
- }
829
- }
830
-
831
814
fn mk_struct_fields ( fields : ~[ @ast:: struct_field ] ) -> ~[ field ] {
832
815
do fields. map |field| {
833
816
let ( ident, mutbl) = match field. node . kind {
@@ -847,96 +830,6 @@ fn mk_struct_fields(fields: ~[@ast::struct_field]) -> ~[field] {
847
830
}
848
831
}
849
832
850
- fn mk_ser_fields (
851
- cx : ext_ctxt ,
852
- span : span ,
853
- fields : ~[ field ]
854
- ) -> ~[ @ast:: stmt ] {
855
- do fields. mapi |idx, field| {
856
- // ast for `|| self.$(name).encode(__s)`
857
- let expr_lambda = cx. lambda_expr (
858
- cx. expr_call (
859
- span,
860
- cx. expr_field (
861
- span,
862
- cx. expr_field (
863
- span,
864
- cx. expr_var ( span, ~"self ") ,
865
- field. ident
866
- ) ,
867
- cx. ident_of ( ~"encode")
868
- ) ,
869
- ~[ cx. expr_var ( span, ~"__s") ]
870
- )
871
- ) ;
872
-
873
- // ast for `__s.emit_field($(name), $(idx), $(expr_lambda))`
874
- cx. stmt (
875
- cx. expr_call (
876
- span,
877
- cx. expr_field (
878
- span,
879
- cx. expr_var ( span, ~"__s") ,
880
- cx. ident_of ( ~"emit_field")
881
- ) ,
882
- ~[
883
- cx. lit_str ( span, @cx. str_of ( field. ident ) ) ,
884
- cx. lit_uint ( span, idx) ,
885
- expr_lambda,
886
- ]
887
- )
888
- )
889
- }
890
- }
891
-
892
- fn mk_deser_fields (
893
- cx : ext_ctxt ,
894
- span : span ,
895
- fields : ~[ field ]
896
- ) -> ~[ ast:: field ] {
897
- do fields. mapi |idx, field| {
898
- // ast for `|| std::serialize::decode(__d)`
899
- let expr_lambda = cx. lambda (
900
- cx. expr_blk (
901
- cx. expr_call (
902
- span,
903
- cx. expr_path_global ( span, ~[
904
- cx. ident_of ( ~"std") ,
905
- cx. ident_of ( ~"serialize") ,
906
- cx. ident_of ( ~"Decodable ") ,
907
- cx. ident_of ( ~"decode") ,
908
- ] ) ,
909
- ~[ cx. expr_var ( span, ~"__d") ]
910
- )
911
- )
912
- ) ;
913
-
914
- // ast for `__d.read_field($(name), $(idx), $(expr_lambda))`
915
- let expr: @ast:: expr = cx. expr_call (
916
- span,
917
- cx. expr_field (
918
- span,
919
- cx. expr_var ( span, ~"__d") ,
920
- cx. ident_of ( ~"read_field")
921
- ) ,
922
- ~[
923
- cx. lit_str ( span, @cx. str_of ( field. ident ) ) ,
924
- cx. lit_uint ( span, idx) ,
925
- expr_lambda,
926
- ]
927
- ) ;
928
-
929
- ast:: spanned {
930
- node : ast:: field_ {
931
- mutbl : field. mutbl ,
932
- ident : field. ident ,
933
- expr : expr,
934
- } ,
935
- span : span,
936
- }
937
- }
938
- }
939
-
940
833
fn mk_enum_ser_impl (
941
834
cx : ext_ctxt ,
942
835
span : span ,
0 commit comments