Skip to content

Commit 4f4160e

Browse files
ericktnikomatsakis
authored andcommitted
Factor out auto_serialize2's impls from each other.
1 parent c46b6f9 commit 4f4160e

File tree

1 file changed

+114
-67
lines changed

1 file changed

+114
-67
lines changed

src/libsyntax/ext/auto_serialize2.rs

Lines changed: 114 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,61 @@ fn expand(cx: ext_ctxt,
9999
do vec::flat_map(in_items) |item| {
100100
match item.node {
101101
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]
106119
},
107120
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]
112138
},
113139
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]
118157
},
119158
_ => {
120159
cx.span_err(span, ~"#[auto_serialize2] can only be applied \
@@ -396,30 +435,40 @@ fn mk_deser_method(
396435
}
397436
}
398437

399-
fn mk_rec_impl(
438+
fn mk_rec_ser_impl(
400439
cx: ext_ctxt,
401440
span: span,
402441
ident: ast::ident,
403442
fields: ~[ast::ty_field],
404443
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));
409446

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(
412449
span,
413450
cx.expr_field(
414451
span,
415452
cx.expr_var(span, ~"__s"),
416453
cx.ident_of(~"emit_rec")
417454
),
418-
~[cx.lambda_stmts(span, ser_fields)]
455+
~[cx.lambda_stmts(span, fields)]
419456
);
420457

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(
423472
span,
424473
cx.expr_field(
425474
span,
@@ -430,30 +479,25 @@ fn mk_rec_impl(
430479
cx.lambda_expr(
431480
cx.expr(
432481
span,
433-
ast::expr_rec(deser_fields, None)
482+
ast::expr_rec(fields, None)
434483
)
435484
)
436485
]
437486
);
438487

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)
443489
}
444490

445-
fn mk_struct_impl(
491+
fn mk_struct_ser_impl(
446492
cx: ext_ctxt,
447493
span: span,
448494
ident: ast::ident,
449495
fields: ~[@ast::struct_field],
450496
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));
455499

456-
// ast for `__s.emit_struct($(name), || $(ser_fields))`
500+
// ast for `__s.emit_struct($(name), || $(fields))`
457501
let ser_body = cx.expr_call(
458502
span,
459503
cx.expr_field(
@@ -463,12 +507,24 @@ fn mk_struct_impl(
463507
),
464508
~[
465509
cx.lit_str(span, @cx.str_of(ident)),
466-
cx.lambda_stmts(span, ser_fields),
510+
cx.lambda_stmts(span, fields),
467511
]
468512
);
469513

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(
472528
span,
473529
cx.expr_field(
474530
span,
@@ -478,23 +534,19 @@ fn mk_struct_impl(
478534
~[
479535
cx.lit_str(span, @cx.str_of(ident)),
480536
cx.lambda_expr(
481-
span,
482537
cx.expr(
483538
span,
484539
ast::expr_struct(
485540
cx.path(span, ~[ident]),
486-
deser_fields
541+
fields,
487542
None
488543
)
489544
)
490545
),
491546
]
492-
)
547+
);
493548

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)
498550
}
499551

500552
// Records and structs don't have the same fields types, but they share enough
@@ -576,10 +628,9 @@ fn mk_ser_fields(
576628
fn mk_deser_fields(
577629
cx: ext_ctxt,
578630
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| {
583634
// ast for `|| std::serialization2::deserialize(__d)`
584635
let expr_lambda = cx.lambda(
585636
cx.expr_blk(
@@ -614,45 +665,41 @@ fn mk_deser_fields(
614665
node: { mutbl: field.mutbl, ident: field.ident, expr: expr },
615666
span: span,
616667
}
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+
}
629669
}
630670

631-
fn mk_enum_impl(
671+
fn mk_enum_ser_impl(
632672
cx: ext_ctxt,
633673
span: span,
634674
ident: ast::ident,
635675
enum_def: ast::enum_def,
636676
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(
639679
cx,
640680
span,
641681
ident,
642682
enum_def.variants
643683
);
644684

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(
646696
cx,
647697
span,
648698
ident,
649699
enum_def.variants
650700
);
651701

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)
656703
}
657704

658705
fn ser_variant(

0 commit comments

Comments
 (0)