diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-08-07 14:24:04 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-08-07 14:25:53 -0700 |
| commit | 727c7c74994cf54baecab8ab6b03c50ace44d634 (patch) | |
| tree | 7a3d1ae73f49614ed0163ba20a03f23451d69f00 /src/libsyntax/ext | |
| parent | bc267c696c015525ea303e03d448d1507b6afeb6 (diff) | |
| download | rust-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.rs | 122 | ||||
| -rw-r--r-- | src/libsyntax/ext/pipes/ast_builder.rs | 2 |
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}, |
