summary refs log tree commit diff
path: root/src/libsyntax/ext
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-08-07 14:24:04 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-08-07 14:25:53 -0700
commit727c7c74994cf54baecab8ab6b03c50ace44d634 (patch)
tree7a3d1ae73f49614ed0163ba20a03f23451d69f00 /src/libsyntax/ext
parentbc267c696c015525ea303e03d448d1507b6afeb6 (diff)
downloadrust-727c7c74994cf54baecab8ab6b03c50ace44d634.tar.gz
rust-727c7c74994cf54baecab8ab6b03c50ace44d634.zip
rustc: Add stub support for struct variants to the AST
Diffstat (limited to 'src/libsyntax/ext')
-rw-r--r--src/libsyntax/ext/auto_serialize.rs122
-rw-r--r--src/libsyntax/ext/pipes/ast_builder.rs2
2 files changed, 70 insertions, 54 deletions
diff --git a/src/libsyntax/ext/auto_serialize.rs b/src/libsyntax/ext/auto_serialize.rs
index 053c972d1ea..4ce017eeae9 100644
--- a/src/libsyntax/ext/auto_serialize.rs
+++ b/src/libsyntax/ext/auto_serialize.rs
@@ -830,43 +830,51 @@ fn ser_enum(cx: ext_ctxt, tps: ser_tps_map, e_name: ast::ident,
         let variant = variants[vidx];
         let v_span = variant.span;
         let v_name = variant.node.name;
-        let variant_tys = vec::map(variant.node.args, |a| a.ty);
-
-        ser_variant(
-            cx, tps, variant_tys, v_span, cx.clone(s),
-
-            // Generate pattern var(v1, v2, v3)
-            |pats| {
-                if vec::is_empty(pats) {
-                    ast::pat_ident(ast::bind_by_implicit_ref,
-                                   cx.path(v_span, ~[v_name]),
-                                   none)
-                } else {
-                    ast::pat_enum(cx.path(v_span, ~[v_name]), some(pats))
-                }
-            },
-
-            // Generate body s.emit_enum_variant("foo", 0u,
-            //                                   3u, {|| blk })
-            |-s, blk| {
-                let v_name = cx.lit_str(v_span, v_name);
-                let v_id = cx.lit_uint(v_span, vidx);
-                let sz = cx.lit_uint(v_span, vec::len(variant_tys));
-                let body = cx.lambda(blk);
-                #ast[expr]{
-                    $(s).emit_enum_variant($(v_name), $(v_id),
-                                           $(sz), $(body))
-                }
-            },
-
-            // Generate s.emit_enum_variant_arg(i, {|| blk })
-            |-s, i, blk| {
-                let idx = cx.lit_uint(v_span, i);
-                let body = cx.lambda(blk);
-                #ast[expr]{
-                    $(s).emit_enum_variant_arg($(idx), $(body))
-                }
-            })
+
+        match variant.node.kind {
+            ast::tuple_variant_kind(args) => {
+                let variant_tys = vec::map(args, |a| a.ty);
+
+                ser_variant(
+                    cx, tps, variant_tys, v_span, cx.clone(s),
+
+                    // Generate pattern var(v1, v2, v3)
+                    |pats| {
+                        if vec::is_empty(pats) {
+                            ast::pat_ident(ast::bind_by_implicit_ref,
+                                           cx.path(v_span, ~[v_name]),
+                                           none)
+                        } else {
+                            ast::pat_enum(cx.path(v_span, ~[v_name]),
+                                                  some(pats))
+                        }
+                    },
+
+                    // Generate body s.emit_enum_variant("foo", 0u,
+                    //                                   3u, {|| blk })
+                    |-s, blk| {
+                        let v_name = cx.lit_str(v_span, v_name);
+                        let v_id = cx.lit_uint(v_span, vidx);
+                        let sz = cx.lit_uint(v_span, vec::len(variant_tys));
+                        let body = cx.lambda(blk);
+                        #ast[expr]{
+                            $(s).emit_enum_variant($(v_name), $(v_id),
+                                                   $(sz), $(body))
+                        }
+                    },
+
+                    // Generate s.emit_enum_variant_arg(i, {|| blk })
+                    |-s, i, blk| {
+                        let idx = cx.lit_uint(v_span, i);
+                        let body = cx.lambda(blk);
+                        #ast[expr]{
+                            $(s).emit_enum_variant_arg($(idx), $(body))
+                        }
+                    })
+            }
+            _ =>
+                fail ~"struct variants unimplemented for auto serialize"
+        }
     };
     let lam = cx.lambda(cx.blk(e_span, ~[cx.alt_stmt(arms, e_span, v)]));
     let e_name = cx.lit_str(e_span, e_name);
@@ -881,24 +889,32 @@ fn deser_enum(cx: ext_ctxt, tps: deser_tps_map, e_name: ast::ident,
         let variant = variants[vidx];
         let v_span = variant.span;
         let v_name = variant.node.name;
-        let tys = vec::map(variant.node.args, |a| a.ty);
-
-        let arg_exprs = do vec::from_fn(vec::len(tys)) |i| {
-            let idx = cx.lit_uint(v_span, i);
-            let body = deser_lambda(cx, tps, tys[i], cx.clone(d));
-            #ast{ $(d).read_enum_variant_arg($(idx), $(body)) }
-        };
 
-        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))
+        let body;
+        match variant.node.kind {
+            ast::tuple_variant_kind(args) => {
+                let tys = vec::map(args, |a| a.ty);
+
+                let arg_exprs = do vec::from_fn(vec::len(tys)) |i| {
+                    let idx = cx.lit_uint(v_span, i);
+                    let body = deser_lambda(cx, tps, tys[i], cx.clone(d));
+                    #ast{ $(d).read_enum_variant_arg($(idx), $(body)) }
+                };
+
+                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))
+                    }
+                };
             }
-        };
+            ast::struct_variant_kind =>
+                fail ~"struct variants unimplemented"
+        }
 
         {pats: ~[@{id: cx.next_id(),
                   node: ast::pat_lit(cx.lit_uint(v_span, vidx)),
diff --git a/src/libsyntax/ext/pipes/ast_builder.rs b/src/libsyntax/ext/pipes/ast_builder.rs
index b8c37f84452..06a22b63fe0 100644
--- a/src/libsyntax/ext/pipes/ast_builder.rs
+++ b/src/libsyntax/ext/pipes/ast_builder.rs
@@ -254,7 +254,7 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
 
         {node: {name: name,
                 attrs: ~[],
-                args: args,
+                kind: ast::tuple_variant_kind(args),
                 id: self.next_id(),
                 disr_expr: none,
                 vis: ast::public},