about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-03-14 20:54:17 -0400
committerNiko Matsakis <niko@alum.mit.edu>2012-03-14 21:05:06 -0400
commita3d2882ffd694caeb274e53c8b8bb4ca03c493b3 (patch)
treecc39f8b79e297eaeb81a150460a80cfea5388fa0
parente702d2019131a51630ee5f46ccff4a3bd31e178a (diff)
downloadrust-a3d2882ffd694caeb274e53c8b8bb4ca03c493b3.tar.gz
rust-a3d2882ffd694caeb274e53c8b8bb4ca03c493b3.zip
fixup auto_serialize's treatment of nullary variants
-rw-r--r--src/libstd/prettyprint.rs6
-rw-r--r--src/rustc/syntax/ext/auto_serialize.rs13
-rw-r--r--src/test/run-pass/auto_serialize.rs15
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