Cleanup train

This commit is contained in:
Erick Tryzelaar
2015-03-15 15:04:11 -07:00
parent aacc14ad7b
commit b628446768
3 changed files with 36 additions and 33 deletions
+5 -15
View File
@@ -34,7 +34,7 @@ use syntax::ptr::P;
use aster; use aster;
use field::field_alias; use field::struct_field_strs;
pub fn expand_derive_deserialize( pub fn expand_derive_deserialize(
cx: &mut ExtCtxt, cx: &mut ExtCtxt,
@@ -431,7 +431,6 @@ fn deserialize_struct_named_fields(
cx, cx,
builder, builder,
&field_names, &field_names,
fields,
struct_def, struct_def,
); );
@@ -483,7 +482,6 @@ fn deserialize_field_visitor(
cx: &ExtCtxt, cx: &ExtCtxt,
builder: &aster::AstBuilder, builder: &aster::AstBuilder,
field_names: &[ast::Ident], field_names: &[ast::Ident],
fields: &[Ident],
struct_def: &StructDef, struct_def: &StructDef,
) -> Vec<P<ast::Item>> { ) -> Vec<P<ast::Item>> {
let field_enum = builder.item().enum_("__Field") let field_enum = builder.item().enum_("__Field")
@@ -495,20 +493,13 @@ fn deserialize_field_visitor(
.build(); .build();
// Get aliases // Get aliases
let aliases: Vec<Option<&ast::Lit>> = struct_def.fields.iter() let aliases = struct_field_strs(cx, builder, struct_def);
.map(field_alias)
.collect();
// Match arms to extract a field from a string // Match arms to extract a field from a string
let field_arms: Vec<ast::Arm> = fields.iter() let field_arms: Vec<ast::Arm> = aliases.iter()
.zip(field_names.iter()) .zip(field_names.iter())
.zip(aliases.iter()) .map(|(alias, field)| {
.map(|((name, field), alias_lit)| { quote_arm!(cx, $alias => { Ok(__Field::$field) })
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) })
}) })
.collect(); .collect();
@@ -851,7 +842,6 @@ fn deserialize_enum_variant_map(
cx, cx,
builder, builder,
&field_names, &field_names,
fields,
match variant.node.kind { match variant.node.kind {
ast::VariantKind::StructVariantKind(ref sd) => &*sd, ast::VariantKind::StructVariantKind(ref sd) => &*sd,
_ => panic!("Mismatched enum types") _ => panic!("Mismatched enum types")
+28
View File
@@ -1,4 +1,8 @@
use syntax::ast; use syntax::ast;
use syntax::ext::base::ExtCtxt;
use syntax::ptr::P;
use aster;
pub fn field_alias(field: &ast::StructField) -> Option<&ast::Lit> { pub fn field_alias(field: &ast::StructField) -> Option<&ast::Lit> {
field.node.attrs.iter() 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<P<ast::Expr>> {
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()
}
+3 -18
View File
@@ -13,7 +13,7 @@ use syntax::ptr::P;
use aster; use aster;
use field::field_alias; use field::struct_field_strs;
pub fn expand_derive_serialize( pub fn expand_derive_serialize(
cx: &mut ExtCtxt, cx: &mut ExtCtxt,
@@ -520,24 +520,9 @@ fn serialize_struct_visitor<I>(
{ {
let len = struct_def.fields.len(); let len = struct_def.fields.len();
let key_exprs = struct_def.fields.iter() let key_exprs = struct_field_strs(cx, builder, struct_def);
.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 arms: Vec<ast::Arm> = key_exprs let arms: Vec<ast::Arm> = key_exprs.iter()
.zip(value_exprs) .zip(value_exprs)
.enumerate() .enumerate()
.map(|(i, (key_expr, value_expr))| { .map(|(i, (key_expr, value_expr))| {