From b628446768a5c0eeba236253db89e92f4d7986f9 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Sun, 15 Mar 2015 15:04:11 -0700 Subject: [PATCH] Cleanup train --- serde_macros/src/de.rs | 20 +++++--------------- serde_macros/src/field.rs | 28 ++++++++++++++++++++++++++++ serde_macros/src/ser.rs | 21 +++------------------ 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/serde_macros/src/de.rs b/serde_macros/src/de.rs index 42a6a8c9..b69ed31f 100644 --- a/serde_macros/src/de.rs +++ b/serde_macros/src/de.rs @@ -34,7 +34,7 @@ use syntax::ptr::P; use aster; -use field::field_alias; +use field::struct_field_strs; pub fn expand_derive_deserialize( cx: &mut ExtCtxt, @@ -431,7 +431,6 @@ fn deserialize_struct_named_fields( cx, builder, &field_names, - fields, struct_def, ); @@ -483,7 +482,6 @@ fn deserialize_field_visitor( cx: &ExtCtxt, builder: &aster::AstBuilder, field_names: &[ast::Ident], - fields: &[Ident], struct_def: &StructDef, ) -> Vec> { let field_enum = builder.item().enum_("__Field") @@ -495,20 +493,13 @@ fn deserialize_field_visitor( .build(); // Get aliases - let aliases: Vec> = struct_def.fields.iter() - .map(field_alias) - .collect(); + let aliases = struct_field_strs(cx, builder, struct_def); // Match arms to extract a field from a string - let field_arms: Vec = fields.iter() + let field_arms: Vec = aliases.iter() .zip(field_names.iter()) - .zip(aliases.iter()) - .map(|((name, field), alias_lit)| { - let s = match *alias_lit { - Some(lit) => builder.expr().build_lit(P(lit.clone())), - None => builder.expr().str(name), - }; - quote_arm!(cx, $s => { Ok(__Field::$field) }) + .map(|(alias, field)| { + quote_arm!(cx, $alias => { Ok(__Field::$field) }) }) .collect(); @@ -851,7 +842,6 @@ fn deserialize_enum_variant_map( cx, builder, &field_names, - fields, match variant.node.kind { ast::VariantKind::StructVariantKind(ref sd) => &*sd, _ => panic!("Mismatched enum types") diff --git a/serde_macros/src/field.rs b/serde_macros/src/field.rs index 6b9f8e83..dc0aeaee 100644 --- a/serde_macros/src/field.rs +++ b/serde_macros/src/field.rs @@ -1,4 +1,8 @@ use syntax::ast; +use syntax::ext::base::ExtCtxt; +use syntax::ptr::P; + +use aster; pub fn field_alias(field: &ast::StructField) -> Option<&ast::Lit> { field.node.attrs.iter() @@ -27,3 +31,27 @@ pub fn field_alias(field: &ast::StructField) -> Option<&ast::Lit> { } }) } + +pub fn struct_field_strs( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + struct_def: &ast::StructDef, +) -> Vec> { + struct_def.fields.iter() + .map(|field| { + match field_alias(field) { + Some(alias) => builder.expr().build_lit(P(alias.clone())), + None => { + match field.node.kind { + ast::NamedField(name, _) => { + builder.expr().str(name) + } + ast::UnnamedField(_) => { + cx.bug("struct has named and unnamed fields") + } + } + } + } + }) + .collect() +} diff --git a/serde_macros/src/ser.rs b/serde_macros/src/ser.rs index 6681aaba..af1db63e 100644 --- a/serde_macros/src/ser.rs +++ b/serde_macros/src/ser.rs @@ -13,7 +13,7 @@ use syntax::ptr::P; use aster; -use field::field_alias; +use field::struct_field_strs; pub fn expand_derive_serialize( cx: &mut ExtCtxt, @@ -520,24 +520,9 @@ fn serialize_struct_visitor( { let len = struct_def.fields.len(); - let key_exprs = struct_def.fields.iter() - .map(|field| { - match field_alias(field) { - Some(lit) => builder.expr().build_lit(P(lit.clone())), - None => { - match field.node.kind { - ast::NamedField(name, _) => { - builder.expr().str(name) - } - ast::UnnamedField(_) => { - cx.bug("struct has named and unnamed fields") - } - } - } - } - }); + let key_exprs = struct_field_strs(cx, builder, struct_def); - let arms: Vec = key_exprs + let arms: Vec = key_exprs.iter() .zip(value_exprs) .enumerate() .map(|(i, (key_expr, value_expr))| {