Skip to content

Commit 41ab12a

Browse files
ericktnikomatsakis
authored andcommitted
---
yaml --- r: 30942 b: refs/heads/incoming c: 4f4160e h: refs/heads/master v: v3
1 parent d921568 commit 41ab12a

File tree

2 files changed

+115
-68
lines changed

2 files changed

+115
-68
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: d324a424d8f84b1eb049b12cf34182bda91b0024
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: d0c6ce338884ee21843f4b40bf6bf18d222ce5df
9-
refs/heads/incoming: c46b6f9efbbb00706a62d86a9afc4fd59bc13c12
9+
refs/heads/incoming: 4f4160ee3bd4ca0779821c24240af525d07d859a
1010
refs/heads/dist-snap: 2f32a1581f522e524009138b33b1c7049ced668d
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/incoming/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)