Merge pull request #2791 from dtolnay/flatten
Skip collecting unmatched fields in variants that do not use flatten
This commit is contained in:
commit
c3eaf76430
@ -2480,7 +2480,10 @@ fn deserialize_map(
|
||||
});
|
||||
|
||||
// Collect contents for flatten fields into a buffer
|
||||
let let_collect = if cattrs.has_flatten() {
|
||||
let has_flatten = fields
|
||||
.iter()
|
||||
.any(|field| field.attrs.flatten() && !field.attrs.skip_deserializing());
|
||||
let let_collect = if has_flatten {
|
||||
Some(quote! {
|
||||
let mut __collect = _serde::__private::Vec::<_serde::__private::Option<(
|
||||
_serde::__private::de::Content,
|
||||
@ -2532,7 +2535,7 @@ fn deserialize_map(
|
||||
});
|
||||
|
||||
// Visit ignored values to consume them
|
||||
let ignored_arm = if cattrs.has_flatten() {
|
||||
let ignored_arm = if has_flatten {
|
||||
Some(quote! {
|
||||
__Field::__other(__name) => {
|
||||
__collect.push(_serde::__private::Some((
|
||||
@ -2602,7 +2605,7 @@ fn deserialize_map(
|
||||
}
|
||||
});
|
||||
|
||||
let collected_deny_unknown_fields = if cattrs.has_flatten() && cattrs.deny_unknown_fields() {
|
||||
let collected_deny_unknown_fields = if has_flatten && cattrs.deny_unknown_fields() {
|
||||
Some(quote! {
|
||||
if let _serde::__private::Some(_serde::__private::Some((__key, _))) =
|
||||
__collect.into_iter().filter(_serde::__private::Option::is_some).next()
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#![deny(warnings)]
|
||||
#![allow(
|
||||
confusable_idents,
|
||||
unknown_lints,
|
||||
mixed_script_confusables,
|
||||
clippy::derive_partial_eq_without_eq,
|
||||
@ -19,6 +20,7 @@
|
||||
clippy::trivially_copy_pass_by_ref,
|
||||
clippy::type_repetition_in_bounds
|
||||
)]
|
||||
#![deny(clippy::collection_is_never_read)]
|
||||
|
||||
use serde::de::{Deserialize, DeserializeOwned, Deserializer};
|
||||
use serde::ser::{Serialize, Serializer};
|
||||
@ -724,6 +726,19 @@ fn test_gen() {
|
||||
flat: T,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum Inner<T> {
|
||||
Builder {
|
||||
s: T,
|
||||
#[serde(flatten)]
|
||||
o: T,
|
||||
},
|
||||
Default {
|
||||
s: T,
|
||||
},
|
||||
}
|
||||
|
||||
// https://github.com/serde-rs/serde/issues/1804
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub enum Message {
|
||||
|
Loading…
Reference in New Issue
Block a user