mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-09 20:11:01 +00:00
Even more to aster
This commit is contained in:
@@ -126,8 +126,7 @@ fn serialize_substructure(
|
|||||||
substr: &Substructure,
|
substr: &Substructure,
|
||||||
item: &Item,
|
item: &Item,
|
||||||
) -> P<Expr> {
|
) -> P<Expr> {
|
||||||
let ctx = aster::Ctx::new();
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
let builder = aster::AstBuilder::new(&ctx).span(span);
|
|
||||||
|
|
||||||
let visitor = substr.nonself_args[0].clone();
|
let visitor = substr.nonself_args[0].clone();
|
||||||
|
|
||||||
@@ -458,9 +457,9 @@ fn serialize_variant(
|
|||||||
let visitor_ident = builder.id("__Visitor");
|
let visitor_ident = builder.id("__Visitor");
|
||||||
|
|
||||||
let visitor_struct = builder.item().struct_(visitor_ident)
|
let visitor_struct = builder.item().struct_(visitor_ident)
|
||||||
.with_generics(generics.clone())
|
.generics().with(generics.clone()).build()
|
||||||
.field("state").usize()
|
.field("state").usize()
|
||||||
.field("value").build_ty(value_ty)
|
.field("value").build(value_ty)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let visitor_expr = builder.expr().struct_path(visitor_ident)
|
let visitor_expr = builder.expr().struct_path(visitor_ident)
|
||||||
@@ -470,7 +469,7 @@ fn serialize_variant(
|
|||||||
fields.iter().map(|field| {
|
fields.iter().map(|field| {
|
||||||
builder.expr()
|
builder.expr()
|
||||||
.addr_of()
|
.addr_of()
|
||||||
.build_expr(field.self_.clone())
|
.build(field.self_.clone())
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
@@ -651,8 +650,7 @@ fn deserialize_substructure(
|
|||||||
substr: &Substructure,
|
substr: &Substructure,
|
||||||
item: &Item,
|
item: &Item,
|
||||||
) -> P<Expr> {
|
) -> P<Expr> {
|
||||||
let ctx = aster::Ctx::new();
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
let builder = aster::AstBuilder::new(&ctx).span(span);
|
|
||||||
|
|
||||||
let state = substr.nonself_args[0].clone();
|
let state = substr.nonself_args[0].clone();
|
||||||
|
|
||||||
@@ -674,7 +672,6 @@ fn deserialize_substructure(
|
|||||||
(&ast::ItemEnum(_, ref generics), &StaticEnum(ref enum_def, ref fields)) => {
|
(&ast::ItemEnum(_, ref generics), &StaticEnum(ref enum_def, ref fields)) => {
|
||||||
deserialize_enum(
|
deserialize_enum(
|
||||||
cx,
|
cx,
|
||||||
span,
|
|
||||||
&builder,
|
&builder,
|
||||||
substr.type_ident,
|
substr.type_ident,
|
||||||
&fields,
|
&fields,
|
||||||
@@ -712,7 +709,6 @@ fn deserialize_struct(
|
|||||||
} else {
|
} else {
|
||||||
deserialize_struct_unnamed_fields(
|
deserialize_struct_unnamed_fields(
|
||||||
cx,
|
cx,
|
||||||
span,
|
|
||||||
builder,
|
builder,
|
||||||
type_ident,
|
type_ident,
|
||||||
struct_ident,
|
struct_ident,
|
||||||
@@ -789,7 +785,6 @@ fn deserialize_struct_empty_fields(
|
|||||||
|
|
||||||
fn deserialize_struct_unnamed_fields(
|
fn deserialize_struct_unnamed_fields(
|
||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
span: Span,
|
|
||||||
builder: &aster::AstBuilder,
|
builder: &aster::AstBuilder,
|
||||||
type_ident: Ident,
|
type_ident: Ident,
|
||||||
struct_ident: Ident,
|
struct_ident: Ident,
|
||||||
@@ -810,7 +805,6 @@ fn deserialize_struct_unnamed_fields(
|
|||||||
|
|
||||||
let visit_seq_expr = declare_visit_seq(
|
let visit_seq_expr = declare_visit_seq(
|
||||||
cx,
|
cx,
|
||||||
span,
|
|
||||||
builder,
|
builder,
|
||||||
struct_path,
|
struct_path,
|
||||||
&field_names,
|
&field_names,
|
||||||
@@ -826,7 +820,7 @@ fn deserialize_struct_unnamed_fields(
|
|||||||
} else {
|
} else {
|
||||||
(
|
(
|
||||||
builder.item().tuple_struct("__Visitor")
|
builder.item().tuple_struct("__Visitor")
|
||||||
.with_generics(generics.clone())
|
.generics().with(generics.clone()).build()
|
||||||
.with_tys(
|
.with_tys(
|
||||||
generics.ty_params.iter().map(|ty_param| {
|
generics.ty_params.iter().map(|ty_param| {
|
||||||
builder.ty().phantom_data().id(ty_param.ident)
|
builder.ty().phantom_data().id(ty_param.ident)
|
||||||
@@ -936,6 +930,7 @@ fn deserialize_struct_named_fields(
|
|||||||
let field_deserializer = declare_map_field_deserializer(
|
let field_deserializer = declare_map_field_deserializer(
|
||||||
cx,
|
cx,
|
||||||
span,
|
span,
|
||||||
|
builder,
|
||||||
&field_names,
|
&field_names,
|
||||||
fields,
|
fields,
|
||||||
struct_def,
|
struct_def,
|
||||||
@@ -943,7 +938,7 @@ fn deserialize_struct_named_fields(
|
|||||||
|
|
||||||
let visit_map_expr = declare_visit_map(
|
let visit_map_expr = declare_visit_map(
|
||||||
cx,
|
cx,
|
||||||
span,
|
builder,
|
||||||
struct_path,
|
struct_path,
|
||||||
&field_names,
|
&field_names,
|
||||||
fields,
|
fields,
|
||||||
@@ -1013,6 +1008,7 @@ fn field_alias(field: &ast::StructField) -> Option<&ast::Lit> {
|
|||||||
fn declare_map_field_deserializer(
|
fn declare_map_field_deserializer(
|
||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
span: Span,
|
span: Span,
|
||||||
|
_builder: &aster::AstBuilder,
|
||||||
field_names: &[ast::Ident],
|
field_names: &[ast::Ident],
|
||||||
fields: &[(Ident, Span)],
|
fields: &[(Ident, Span)],
|
||||||
struct_def: &StructDef,
|
struct_def: &StructDef,
|
||||||
@@ -1121,7 +1117,7 @@ fn default_value(field: &ast::StructField) -> bool {
|
|||||||
|
|
||||||
fn declare_visit_map(
|
fn declare_visit_map(
|
||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
span: Span,
|
builder: &aster::AstBuilder,
|
||||||
struct_path: ast::Path,
|
struct_path: ast::Path,
|
||||||
field_names: &[Ident],
|
field_names: &[Ident],
|
||||||
fields: &[(Ident, Span)],
|
fields: &[(Ident, Span)],
|
||||||
@@ -1166,16 +1162,15 @@ fn declare_visit_map(
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let result = cx.expr_struct(
|
let result = builder.expr().struct_path(struct_path)
|
||||||
span,
|
.with_id_exprs(
|
||||||
struct_path,
|
fields.iter()
|
||||||
fields.iter()
|
.zip(field_names.iter())
|
||||||
.zip(field_names.iter())
|
.map(|(&(name, _), field)| {
|
||||||
.map(|(&(name, span), field)| {
|
(name, builder.expr().id(field))
|
||||||
cx.field_imm(span, name, cx.expr_ident(span, *field))
|
})
|
||||||
})
|
)
|
||||||
.collect()
|
.build();
|
||||||
);
|
|
||||||
|
|
||||||
quote_expr!(cx, {
|
quote_expr!(cx, {
|
||||||
$let_values
|
$let_values
|
||||||
@@ -1286,7 +1281,6 @@ fn deserialize_enum_variant(
|
|||||||
|
|
||||||
let visit_seq_expr = declare_visit_seq(
|
let visit_seq_expr = declare_visit_seq(
|
||||||
cx,
|
cx,
|
||||||
span,
|
|
||||||
builder,
|
builder,
|
||||||
variant_path,
|
variant_path,
|
||||||
&field_names,
|
&field_names,
|
||||||
@@ -1318,6 +1312,7 @@ fn deserialize_enum_variant(
|
|||||||
let field_deserializer = declare_map_field_deserializer(
|
let field_deserializer = declare_map_field_deserializer(
|
||||||
cx,
|
cx,
|
||||||
span,
|
span,
|
||||||
|
builder,
|
||||||
&field_names,
|
&field_names,
|
||||||
fields,
|
fields,
|
||||||
match variant_ptr.node.kind {
|
match variant_ptr.node.kind {
|
||||||
@@ -1328,7 +1323,7 @@ fn deserialize_enum_variant(
|
|||||||
|
|
||||||
let visit_map_expr = declare_visit_map(
|
let visit_map_expr = declare_visit_map(
|
||||||
cx,
|
cx,
|
||||||
span,
|
builder,
|
||||||
variant_path,
|
variant_path,
|
||||||
&field_names,
|
&field_names,
|
||||||
fields,
|
fields,
|
||||||
|
|||||||
Reference in New Issue
Block a user