fixup auto_serialize's treatment of nullary variants

This commit is contained in:
Niko Matsakis 2012-03-14 20:54:17 -04:00
parent e702d20191
commit a3d2882ffd
3 changed files with 28 additions and 6 deletions

View file

@ -71,11 +71,11 @@ impl of serializer for writer {
f();
}
fn emit_enum_variant(v_name: str, _v_id: uint, _sz: uint, f: fn()) {
fn emit_enum_variant(v_name: str, _v_id: uint, sz: uint, f: fn()) {
self.write_str(v_name);
self.write_str("(");
if sz > 0u { self.write_str("("); }
f();
self.write_str(")");
if sz > 0u { self.write_str(")"); }
}
fn emit_enum_variant_arg(idx: uint, f: fn()) {

View file

@ -816,9 +816,16 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: str,
#ast{ $(d).read_enum_variant_arg($(idx), $(body)) }
};
let body =
cx.expr(v_span, ast::expr_call(
cx.var_ref(v_span, v_name), arg_exprs, false));
let body = {
if vec::is_empty(tys) {
// for a nullary variant v, do "v"
cx.var_ref(v_span, v_name)
} else {
// for an n-ary variant v, do "v(a_1, ..., a_n)"
cx.expr(v_span, ast::expr_call(
cx.var_ref(v_span, v_name), arg_exprs, false))
}
};
{pats: [@{id: cx.next_id(),
node: ast::pat_lit(cx.lit_uint(v_span, vidx)),

View file

@ -72,6 +72,9 @@ enum quark<T> {
#[auto_serialize]
type uint_quark = quark<uint>;
#[auto_serialize]
enum c_like { a, b, c }
fn main() {
test_ser_and_deser(plus(@minus(@val(3u), @val(10u)),
@ -117,4 +120,16 @@ fn main() {
serialize_uint_quark(_, _),
deserialize_uint_quark(_),
serialize_uint_quark(_, _));
test_ser_and_deser(a,
"a",
serialize_c_like(_, _),
deserialize_c_like(_),
serialize_c_like(_, _));
test_ser_and_deser(b,
"b",
serialize_c_like(_, _),
deserialize_c_like(_),
serialize_c_like(_, _));
}