Skip to content

Commit 77a6a9d

Browse files
committed
Take into account only not skipped flatten fields when choose serialization form
Consequence: `FlattenSkipSerializing` - uses `serialize_struct` instead of `serialize_map`
1 parent 547d843 commit 77a6a9d

File tree

3 files changed

+5
-39
lines changed

3 files changed

+5
-39
lines changed

serde_derive/src/internals/ast.rs

+1-12
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl<'a> Container<'a> {
6363
item: &'a syn::DeriveInput,
6464
derive: Derive,
6565
) -> Option<Container<'a>> {
66-
let mut attrs = attr::Container::from_ast(cx, item);
66+
let attrs = attr::Container::from_ast(cx, item);
6767

6868
let mut data = match &item.data {
6969
syn::Data::Enum(data) => Data::Enum(enum_from_ast(cx, &data.variants, attrs.default())),
@@ -77,15 +77,11 @@ impl<'a> Container<'a> {
7777
}
7878
};
7979

80-
let mut has_flatten = false;
8180
match &mut data {
8281
Data::Enum(variants) => {
8382
for variant in variants {
8483
variant.attrs.rename_by_rules(attrs.rename_all_rules());
8584
for field in &mut variant.fields {
86-
if field.attrs.flatten() {
87-
has_flatten = true;
88-
}
8985
field.attrs.rename_by_rules(
9086
variant
9187
.attrs
@@ -97,18 +93,11 @@ impl<'a> Container<'a> {
9793
}
9894
Data::Struct(_, fields) => {
9995
for field in fields {
100-
if field.attrs.flatten() {
101-
has_flatten = true;
102-
}
10396
field.attrs.rename_by_rules(attrs.rename_all_rules());
10497
}
10598
}
10699
}
107100

108-
if has_flatten {
109-
attrs.mark_has_flatten();
110-
}
111-
112101
let mut item = Container {
113102
ident: item.ident.clone(),
114103
attrs,

serde_derive/src/internals/attr.rs

-26
Original file line numberDiff line numberDiff line change
@@ -216,23 +216,6 @@ pub struct Container {
216216
type_into: Option<syn::Type>,
217217
remote: Option<syn::Path>,
218218
identifier: Identifier,
219-
/// True if container is a struct and has a field with `#[serde(flatten)]`,
220-
/// or is an enum with a struct variant which has a field with
221-
/// `#[serde(flatten)]`.
222-
///
223-
/// ```ignore
224-
/// struct Container {
225-
/// #[serde(flatten)]
226-
/// some_field: (),
227-
/// }
228-
/// enum Container {
229-
/// Variant {
230-
/// #[serde(flatten)]
231-
/// some_field: (),
232-
/// },
233-
/// }
234-
/// ```
235-
has_flatten: bool,
236219
serde_path: Option<syn::Path>,
237220
is_packed: bool,
238221
/// Error message generated when type can't be deserialized
@@ -603,7 +586,6 @@ impl Container {
603586
type_into: type_into.get(),
604587
remote: remote.get(),
605588
identifier: decide_identifier(cx, item, field_identifier, variant_identifier),
606-
has_flatten: false,
607589
serde_path: serde_path.get(),
608590
is_packed,
609591
expecting: expecting.get(),
@@ -671,14 +653,6 @@ impl Container {
671653
self.identifier
672654
}
673655

674-
pub fn has_flatten(&self) -> bool {
675-
self.has_flatten
676-
}
677-
678-
pub fn mark_has_flatten(&mut self) {
679-
self.has_flatten = true;
680-
}
681-
682656
pub fn custom_serde_path(&self) -> Option<&syn::Path> {
683657
self.serde_path.as_ref()
684658
}

serde_derive/src/ser.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,10 @@ fn serialize_struct(params: &Parameters, fields: &[Field], cattrs: &attr::Contai
297297
u32::MAX
298298
);
299299

300-
if cattrs.has_flatten() {
300+
let has_non_skipped_flatten = fields
301+
.iter()
302+
.any(|field| field.attrs.flatten() && !field.attrs.skip_serializing());
303+
if has_non_skipped_flatten {
301304
serialize_struct_as_map(params, fields, cattrs)
302305
} else {
303306
serialize_struct_as_struct(params, fields, cattrs)

0 commit comments

Comments
 (0)