diff options
| author | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-03-26 18:46:48 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2013-03-27 07:04:13 -0700 |
| commit | 4d6dcefcbb8688b69dd80bc7382a2f593c3b08d8 (patch) | |
| tree | 0c688bb5af8a87ec2566e0d88da9b031e539e625 /src/libsyntax/ext/auto_encode.rs | |
| parent | 478e4498b76178dc0031f88f0d5ee31c5f804d0b (diff) | |
| download | rust-4d6dcefcbb8688b69dd80bc7382a2f593c3b08d8.tar.gz rust-4d6dcefcbb8688b69dd80bc7382a2f593c3b08d8.zip | |
std: Decode::read_enum_variant should pass in the variant names
Because the json::Decoder uses the string variant name, we need a way to correlate the string to the enum index. This passes in a static &[&str] to read_enum_variant, which allows the json::Decoder to know which branch it's trying to process.
Diffstat (limited to 'src/libsyntax/ext/auto_encode.rs')
| -rw-r--r-- | src/libsyntax/ext/auto_encode.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/libsyntax/ext/auto_encode.rs b/src/libsyntax/ext/auto_encode.rs index bafd2bb6adb..2a112f106a8 100644 --- a/src/libsyntax/ext/auto_encode.rs +++ b/src/libsyntax/ext/auto_encode.rs @@ -1059,6 +1059,18 @@ fn mk_enum_deser_body( name: ast::ident, variants: ~[ast::variant] ) -> @ast::expr { + let expr_arm_names = build::mk_base_vec_e( + ext_cx, + span, + do variants.map |variant| { + build::mk_base_str( + ext_cx, + span, + ext_cx.str_of(variant.node.name) + ) + } + ); + let mut arms = do variants.mapi |v_idx, variant| { let body = match variant.node.kind { ast::tuple_variant_kind(ref args) => { @@ -1152,13 +1164,13 @@ fn mk_enum_deser_body( ) ); - // ast for `__d.read_enum_variant($(expr_lambda))` + // ast for `__d.read_enum_variant($expr_arm_names, $(expr_lambda))` let expr_lambda = ext_cx.lambda_expr( ext_cx.expr_method_call( span, ext_cx.expr_var(span, ~"__d"), ext_cx.ident_of(~"read_enum_variant"), - ~[expr_lambda] + ~[expr_arm_names, expr_lambda] ) ); @@ -1174,7 +1186,6 @@ fn mk_enum_deser_body( ) } - #[cfg(test)] mod test { use core::option::{None, Some}; |
