From f5e0fbcb141b2a111adf3bb16a5f1a4850ed70d3 Mon Sep 17 00:00:00 2001 From: bebecue Date: Sun, 5 Mar 2023 15:14:51 +0800 Subject: [PATCH 1/2] Make #[serde(alias)] works in #[serde(flatten)] context fix #1504 --- serde_derive/src/de.rs | 3 ++- test_suite/tests/test_annotations.rs | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index a703adaf7..679086e61 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -2400,7 +2400,8 @@ fn deserialize_struct_as_struct_visitor( .collect(); let fields_stmt = { - let field_names = field_names_idents.iter().map(|(name, _, _)| name); + let field_names = field_names_idents.iter().flat_map(|(_, _, aliases)| aliases); + quote_block! { const FIELDS: &'static [&'static str] = &[ #(#field_names),* ]; } diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index f32c22c1a..75b7ffdd0 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -642,7 +642,7 @@ fn test_unknown_field_rename_struct() { Token::Str("a4"), Token::I32(3), ], - "unknown field `a4`, expected one of `a1`, `a2`, `a6`", + "unknown field `a4`, expected one of `a1`, `a3`, `a2`, `a5`, `a6`", ); } @@ -780,7 +780,7 @@ fn test_rename_enum() { Token::StructVariant { name: "AliasEnum", variant: "sailor_moon", - len: 3, + len: 5, }, Token::Str("a"), Token::I8(0), @@ -798,7 +798,7 @@ fn test_rename_enum() { Token::StructVariant { name: "AliasEnum", variant: "usagi_tsukino", - len: 3, + len: 5, }, Token::Str("a"), Token::I8(0), @@ -827,7 +827,7 @@ fn test_unknown_field_rename_enum() { Token::StructVariant { name: "AliasEnum", variant: "usagi_tsukino", - len: 3, + len: 5, }, Token::Str("a"), Token::I8(0), @@ -836,7 +836,7 @@ fn test_unknown_field_rename_enum() { Token::Str("d"), Token::I8(2), ], - "unknown field `d`, expected one of `a`, `b`, `f`", + "unknown field `d`, expected one of `a`, `c`, `b`, `e`, `f`", ); } From 01da3f79c9a41220174e8b7e89c3e836325e97ff Mon Sep 17 00:00:00 2001 From: bebecue Date: Tue, 7 Mar 2023 08:09:01 +0800 Subject: [PATCH 2/2] Add tests for #2387 --- test_suite/tests/test_annotations.rs | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 75b7ffdd0..8ff725e01 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2658,6 +2658,68 @@ fn test_flatten_any_after_flatten_struct() { ); } +#[test] +fn test_alias_in_flatten_context() { + #[derive(Debug, PartialEq, Deserialize)] + struct Outer { + #[serde(flatten)] + a: AliasStruct, + b: i32, + } + + assert_de_tokens( + &Outer { + a: AliasStruct { + a1: 1, + a2: 2, + a4: 4, + }, + b: 7, + }, + &[ + Token::Struct { + name: "Outer", + len: 4, + }, + Token::Str("a1"), + Token::I32(1), + Token::Str("a2"), + Token::I32(2), + Token::Str("a5"), + Token::I32(4), + Token::Str("b"), + Token::I32(7), + Token::StructEnd, + ], + ); + + assert_de_tokens( + &Outer { + a: AliasStruct { + a1: 1, + a2: 2, + a4: 4, + }, + b: 7, + }, + &[ + Token::Struct { + name: "Outer", + len: 4, + }, + Token::Str("a1"), + Token::I32(1), + Token::Str("a2"), + Token::I32(2), + Token::Str("a6"), + Token::I32(4), + Token::Str("b"), + Token::I32(7), + Token::StructEnd, + ], + ); +} + #[test] fn test_expecting_message() { #[derive(Deserialize, PartialEq, Debug)]