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
|
// 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! {
|
Some(quote! {
|
||||||
let mut __collect = _serde::__private::Vec::<_serde::__private::Option<(
|
let mut __collect = _serde::__private::Vec::<_serde::__private::Option<(
|
||||||
_serde::__private::de::Content,
|
_serde::__private::de::Content,
|
||||||
@ -2532,7 +2535,7 @@ fn deserialize_map(
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Visit ignored values to consume them
|
// Visit ignored values to consume them
|
||||||
let ignored_arm = if cattrs.has_flatten() {
|
let ignored_arm = if has_flatten {
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
__Field::__other(__name) => {
|
__Field::__other(__name) => {
|
||||||
__collect.push(_serde::__private::Some((
|
__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! {
|
Some(quote! {
|
||||||
if let _serde::__private::Some(_serde::__private::Some((__key, _))) =
|
if let _serde::__private::Some(_serde::__private::Some((__key, _))) =
|
||||||
__collect.into_iter().filter(_serde::__private::Option::is_some).next()
|
__collect.into_iter().filter(_serde::__private::Option::is_some).next()
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#![deny(warnings)]
|
#![deny(warnings)]
|
||||||
#![allow(
|
#![allow(
|
||||||
|
confusable_idents,
|
||||||
unknown_lints,
|
unknown_lints,
|
||||||
mixed_script_confusables,
|
mixed_script_confusables,
|
||||||
clippy::derive_partial_eq_without_eq,
|
clippy::derive_partial_eq_without_eq,
|
||||||
@ -19,6 +20,7 @@
|
|||||||
clippy::trivially_copy_pass_by_ref,
|
clippy::trivially_copy_pass_by_ref,
|
||||||
clippy::type_repetition_in_bounds
|
clippy::type_repetition_in_bounds
|
||||||
)]
|
)]
|
||||||
|
#![deny(clippy::collection_is_never_read)]
|
||||||
|
|
||||||
use serde::de::{Deserialize, DeserializeOwned, Deserializer};
|
use serde::de::{Deserialize, DeserializeOwned, Deserializer};
|
||||||
use serde::ser::{Serialize, Serializer};
|
use serde::ser::{Serialize, Serializer};
|
||||||
@ -724,6 +726,19 @@ fn test_gen() {
|
|||||||
flat: T,
|
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
|
// https://github.com/serde-rs/serde/issues/1804
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
|
Loading…
Reference in New Issue
Block a user