mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 07:51:03 +00:00
Cleanup train
This commit is contained in:
+5
-15
@@ -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")
|
||||||
|
|||||||
@@ -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
@@ -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))| {
|
||||||
|
|||||||
Reference in New Issue
Block a user