diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-03-14 20:54:17 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-03-14 21:05:06 -0400 |
| commit | a3d2882ffd694caeb274e53c8b8bb4ca03c493b3 (patch) | |
| tree | cc39f8b79e297eaeb81a150460a80cfea5388fa0 | |
| parent | e702d2019131a51630ee5f46ccff4a3bd31e178a (diff) | |
| download | rust-a3d2882ffd694caeb274e53c8b8bb4ca03c493b3.tar.gz rust-a3d2882ffd694caeb274e53c8b8bb4ca03c493b3.zip | |
fixup auto_serialize's treatment of nullary variants
| -rw-r--r-- | src/libstd/prettyprint.rs | 6 | ||||
| -rw-r--r-- | src/rustc/syntax/ext/auto_serialize.rs | 13 | ||||
| -rw-r--r-- | src/test/run-pass/auto_serialize.rs | 15 |
3 files changed, 28 insertions, 6 deletions
diff --git a/src/libstd/prettyprint.rs b/src/libstd/prettyprint.rs index 10d971ff0f2..497ed8f0c06 100644 --- a/src/libstd/prettyprint.rs +++ b/src/libstd/prettyprint.rs @@ -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()) { diff --git a/src/rustc/syntax/ext/auto_serialize.rs b/src/rustc/syntax/ext/auto_serialize.rs index 44db1b1e101..23a5b18fe7f 100644 --- a/src/rustc/syntax/ext/auto_serialize.rs +++ b/src/rustc/syntax/ext/auto_serialize.rs @@ -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)), diff --git a/src/test/run-pass/auto_serialize.rs b/src/test/run-pass/auto_serialize.rs index eabe25697d9..59557465932 100644 --- a/src/test/run-pass/auto_serialize.rs +++ b/src/test/run-pass/auto_serialize.rs @@ -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(_, _)); } \ No newline at end of file |
