Skip to content

Commit 5f5c1e8

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 b580642 commit 5f5c1e8

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
@@ -511,7 +511,7 @@ fn deserialize_tuple(
511511
let nfields = fields.len();
512512

513513
let visit_newtype_struct = match form {
514-
TupleForm::Tuple if nfields == 1 => {
514+
TupleForm::Tuple if field_count == 1 => {
515515
let visit_newtype_struct = Stmts(read_fields_in_order(
516516
&type_path,
517517
params,
@@ -570,7 +570,7 @@ fn deserialize_tuple(
570570
}
571571
};
572572
let dispatch = match form {
573-
TupleForm::Tuple if nfields == 1 => {
573+
TupleForm::Tuple if field_count != 0 && nfields == 1 => {
574574
let type_name = cattrs.name().deserialize_name();
575575
quote! {
576576
_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr)
@@ -652,34 +652,27 @@ fn deserialize_tuple_in_place(
652652

653653
let nfields = fields.len();
654654

655-
let visit_newtype_struct = if nfields == 1 {
655+
let visit_newtype_struct = if field_count == 1 {
656656
// We deserialize newtype, so only one field is not skipped
657657
let index = fields
658658
.iter()
659659
.position(|field| !field.attrs.skip_deserializing())
660-
.unwrap_or(0);
661-
let index = Index::from(index);
660+
.map(Index::from)
661+
.unwrap();
662662
let mut deserialize = quote! {
663663
_serde::Deserialize::deserialize_in_place(__e, &mut self.place.#index)
664664
};
665-
let write_defaults = fields.iter().enumerate().filter_map(|(index, field)| {
666-
if field.attrs.skip_deserializing() {
667-
let index = Index::from(index);
668-
let default = Expr(expr_is_missing(field, cattrs));
669-
return Some(quote!(self.place.#index = #default;));
670-
}
671-
None
672-
});
673-
// If there are no deserialized fields, write only defaults
674-
if field_count == 0 {
675-
deserialize = quote! {
676-
#(#write_defaults)*
677-
_serde::__private::Ok(())
678-
}
679-
} else
680665
// Deserialize and write defaults if at least one field is skipped,
681666
// otherwise only deserialize
682-
if nfields > field_count {
667+
if nfields > 1 {
668+
let write_defaults = fields.iter().enumerate().filter_map(|(index, field)| {
669+
if field.attrs.skip_deserializing() {
670+
let index = Index::from(index);
671+
let default = Expr(expr_is_missing(field, cattrs));
672+
return Some(quote!(self.place.#index = #default;));
673+
}
674+
None
675+
});
683676
deserialize = quote! {
684677
match #deserialize {
685678
_serde::__private::Ok(_) => {
@@ -716,7 +709,7 @@ fn deserialize_tuple_in_place(
716709
};
717710

718711
let type_name = cattrs.name().deserialize_name();
719-
let dispatch = if nfields == 1 {
712+
let dispatch = if field_count != 0 && nfields == 1 {
720713
quote!(_serde::Deserializer::deserialize_newtype_struct(__deserializer, #type_name, #visitor_expr))
721714
} else {
722715
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
@@ -230,6 +230,11 @@ fn serialize_newtype_struct(
230230
field: &Field,
231231
cattrs: &attr::Container,
232232
) -> Fragment {
233+
// For `struct Tuple1as0(#[serde(skip)] u8);` cases
234+
if field.attrs.skip_serializing() {
235+
return serialize_tuple_struct(params, &[], cattrs);
236+
}
237+
233238
let type_name = cattrs.name().serialize_name();
234239

235240
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)