Skip to content

Commit edb53a2

Browse files
committed
Change Tuple1as0(Skipped) representation: newtype -> tuple(0), similar to Tuple0() struct
A side-effect: Tuple2as1(Skipped, x) now also can be deserialized using visit_newtype_struct Changes in generated code (see the file attached to PR): Tuple1as0: Tuple1as0Default: Tuple1as0With: removed visit_newtype_struct, *_newtype_struct -> *_tuple_struct(0) Tuple2as1: Tuple2as1Default: Tuple2as1With: added visit_newtype_struct This commit fixes compilation error and actually fixes the issue as it was reported in #2105
1 parent c9d82e1 commit edb53a2

File tree

3 files changed

+21
-24
lines changed

3 files changed

+21
-24
lines changed

serde_derive/src/de.rs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ fn deserialize_tuple(
508508
let nfields = fields.len();
509509

510510
let visit_newtype_struct = match form {
511-
TupleForm::Tuple if nfields == 1 => {
511+
TupleForm::Tuple if field_count == 1 => {
512512
let visit_newtype_struct = Stmts(read_fields_in_order(
513513
&type_path,
514514
params,
@@ -564,7 +564,7 @@ fn deserialize_tuple(
564564
}
565565
};
566566
let dispatch = match form {
567-
TupleForm::Tuple if nfields == 1 => {
567+
TupleForm::Tuple if field_count != 0 && nfields == 1 => {
568568
let type_name = cattrs.name().deserialize_name();
569569
quote! {
570570
_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)
@@ -642,34 +642,27 @@ fn deserialize_tuple_in_place(
642642

643643
let nfields = fields.len();
644644

645-
let visit_newtype_struct = if nfields == 1 {
645+
let visit_newtype_struct = if field_count == 1 {
646646
// We deserialize newtype, so only one field is not skipped
647647
let index = fields
648648
.iter()
649649
.position(|field| !field.attrs.skip_deserializing())
650-
.unwrap_or(0);
651-
let index = Index::from(index);
650+
.map(Index::from)
651+
.unwrap();
652652
let mut deserialize = quote! {
653653
_serde::Deserialize::deserialize_in_place(__e, &mut self.place.#index)
654654
};
655-
let write_defaults = fields.iter().enumerate().filter_map(|(index, field)| {
656-
if field.attrs.skip_deserializing() {
657-
let index = Index::from(index);
658-
let default = Expr(expr_is_missing(field, cattrs));
659-
return Some(quote!(self.place.#index = #default;));
660-
}
661-
None
662-
});
663-
// If there are no deserialized fields, write only defaults
664-
if field_count == 0 {
665-
deserialize = quote! {
666-
#(#write_defaults)*
667-
_serde::__private::Ok(())
668-
}
669-
} else
670655
// Deserialize and write defaults if at least one field is skipped,
671656
// otherwise only deserialize
672-
if nfields > field_count {
657+
if nfields > 1 {
658+
let write_defaults = fields.iter().enumerate().filter_map(|(index, field)| {
659+
if field.attrs.skip_deserializing() {
660+
let index = Index::from(index);
661+
let default = Expr(expr_is_missing(field, cattrs));
662+
return Some(quote!(self.place.#index = #default;));
663+
}
664+
None
665+
});
673666
deserialize = quote! {
674667
match #deserialize {
675668
_serde::__private::Ok(_) => {
@@ -706,7 +699,7 @@ fn deserialize_tuple_in_place(
706699
};
707700

708701
let type_name = cattrs.name().deserialize_name();
709-
let dispatch = if nfields == 1 {
702+
let dispatch = if field_count != 0 && nfields == 1 {
710703
quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
711704
} else {
712705
quote!(_serde::Deserializer::deserialize_tuple_struct(__deserializer, #type_name, #field_count, #visitor_expr))

serde_derive/src/ser.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ fn serialize_newtype_struct(
228228
field: &Field,
229229
cattrs: &attr::Container,
230230
) -> Fragment {
231+
// For `struct Tuple1as0(#[serde(skip)] u8);` cases
232+
if field.attrs.skip_serializing() {
233+
return serialize_tuple_struct(params, &[], cattrs);
234+
}
235+
231236
let type_name = cattrs.name().serialize_name();
232237

233238
let mut field_expr = get_member(

test_suite/tests/test_skip.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ mod tuple_struct {
8787
);
8888
}
8989

90-
/* FIXME: compilation error: https://github.com/serde-rs/serde/issues/2105
9190
#[test]
9291
fn tuple1as0() {
9392
/// This newtype struct in the serialized form the same as `struct Tuple0();`
@@ -107,7 +106,7 @@ mod tuple_struct {
107106
Token::TupleStructEnd,
108107
],
109108
);
110-
}*/
109+
}
111110

112111
#[test]
113112
fn tuple2as0() {

0 commit comments

Comments
 (0)