@@ -281,11 +281,21 @@ fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
281
281
} else if let attr:: Identifier :: No = cont. attrs . identifier ( ) {
282
282
match & cont. data {
283
283
Data :: Enum ( variants) => deserialize_enum ( params, variants, & cont. attrs ) ,
284
- Data :: Struct ( Style :: Struct , fields) => {
285
- deserialize_struct ( params, fields, & cont. attrs , StructForm :: Struct )
286
- }
284
+ Data :: Struct ( Style :: Struct , fields) => deserialize_struct (
285
+ params,
286
+ fields,
287
+ & cont. attrs ,
288
+ cont. attrs . has_flatten ( ) ,
289
+ StructForm :: Struct ,
290
+ ) ,
287
291
Data :: Struct ( Style :: Tuple , fields) | Data :: Struct ( Style :: Newtype , fields) => {
288
- deserialize_tuple ( params, fields, & cont. attrs , TupleForm :: Tuple )
292
+ deserialize_tuple (
293
+ params,
294
+ fields,
295
+ & cont. attrs ,
296
+ cont. attrs . has_flatten ( ) ,
297
+ TupleForm :: Tuple ,
298
+ )
289
299
}
290
300
Data :: Struct ( Style :: Unit , _) => deserialize_unit_struct ( params, & cont. attrs ) ,
291
301
}
@@ -459,9 +469,13 @@ fn deserialize_tuple(
459
469
params : & Parameters ,
460
470
fields : & [ Field ] ,
461
471
cattrs : & attr:: Container ,
472
+ has_flatten : bool ,
462
473
form : TupleForm ,
463
474
) -> Fragment {
464
- assert ! ( !cattrs. has_flatten( ) ) ;
475
+ assert ! (
476
+ !has_flatten,
477
+ "tuples and tuple variants cannot have flatten fields"
478
+ ) ;
465
479
466
480
let field_count = fields
467
481
. iter ( )
@@ -579,7 +593,10 @@ fn deserialize_tuple_in_place(
579
593
fields : & [ Field ] ,
580
594
cattrs : & attr:: Container ,
581
595
) -> Fragment {
582
- assert ! ( !cattrs. has_flatten( ) ) ;
596
+ assert ! (
597
+ !cattrs. has_flatten( ) ,
598
+ "tuples and tuple variants cannot have flatten fields"
599
+ ) ;
583
600
584
601
let field_count = fields
585
602
. iter ( )
@@ -910,6 +927,7 @@ fn deserialize_struct(
910
927
params : & Parameters ,
911
928
fields : & [ Field ] ,
912
929
cattrs : & attr:: Container ,
930
+ has_flatten : bool ,
913
931
form : StructForm ,
914
932
) -> Fragment {
915
933
let this_type = & params. this_type ;
@@ -958,13 +976,13 @@ fn deserialize_struct(
958
976
)
959
977
} )
960
978
. collect ( ) ;
961
- let field_visitor = deserialize_field_identifier ( & field_names_idents, cattrs) ;
979
+ let field_visitor = deserialize_field_identifier ( & field_names_idents, cattrs, has_flatten ) ;
962
980
963
981
// untagged struct variants do not get a visit_seq method. The same applies to
964
982
// structs that only have a map representation.
965
983
let visit_seq = match form {
966
984
StructForm :: Untagged ( ..) => None ,
967
- _ if cattrs . has_flatten ( ) => None ,
985
+ _ if has_flatten => None ,
968
986
_ => {
969
987
let mut_seq = if field_names_idents. is_empty ( ) {
970
988
quote ! ( _)
@@ -987,10 +1005,16 @@ fn deserialize_struct(
987
1005
} )
988
1006
}
989
1007
} ;
990
- let visit_map = Stmts ( deserialize_map ( & type_path, params, fields, cattrs) ) ;
1008
+ let visit_map = Stmts ( deserialize_map (
1009
+ & type_path,
1010
+ params,
1011
+ fields,
1012
+ cattrs,
1013
+ has_flatten,
1014
+ ) ) ;
991
1015
992
1016
let visitor_seed = match form {
993
- StructForm :: ExternallyTagged ( ..) if cattrs . has_flatten ( ) => Some ( quote ! {
1017
+ StructForm :: ExternallyTagged ( ..) if has_flatten => Some ( quote ! {
994
1018
impl #de_impl_generics _serde:: de:: DeserializeSeed <#delife> for __Visitor #de_ty_generics #where_clause {
995
1019
type Value = #this_type #ty_generics;
996
1020
@@ -1005,7 +1029,7 @@ fn deserialize_struct(
1005
1029
_ => None ,
1006
1030
} ;
1007
1031
1008
- let fields_stmt = if cattrs . has_flatten ( ) {
1032
+ let fields_stmt = if has_flatten {
1009
1033
None
1010
1034
} else {
1011
1035
let field_names = field_names_idents
@@ -1025,7 +1049,7 @@ fn deserialize_struct(
1025
1049
}
1026
1050
} ;
1027
1051
let dispatch = match form {
1028
- StructForm :: Struct if cattrs . has_flatten ( ) => quote ! {
1052
+ StructForm :: Struct if has_flatten => quote ! {
1029
1053
_serde:: Deserializer :: deserialize_map( __deserializer, #visitor_expr)
1030
1054
} ,
1031
1055
StructForm :: Struct => {
@@ -1034,7 +1058,7 @@ fn deserialize_struct(
1034
1058
_serde:: Deserializer :: deserialize_struct( __deserializer, #type_name, FIELDS , #visitor_expr)
1035
1059
}
1036
1060
}
1037
- StructForm :: ExternallyTagged ( _) if cattrs . has_flatten ( ) => quote ! {
1061
+ StructForm :: ExternallyTagged ( _) if has_flatten => quote ! {
1038
1062
_serde:: de:: VariantAccess :: newtype_variant_seed( __variant, #visitor_expr)
1039
1063
} ,
1040
1064
StructForm :: ExternallyTagged ( _) => quote ! {
@@ -1116,7 +1140,7 @@ fn deserialize_struct_in_place(
1116
1140
} )
1117
1141
. collect ( ) ;
1118
1142
1119
- let field_visitor = deserialize_field_identifier ( & field_names_idents, cattrs) ;
1143
+ let field_visitor = deserialize_field_identifier ( & field_names_idents, cattrs, false ) ;
1120
1144
1121
1145
let mut_seq = if field_names_idents. is_empty ( ) {
1122
1146
quote ! ( _)
@@ -1210,10 +1234,7 @@ fn deserialize_homogeneous_enum(
1210
1234
}
1211
1235
}
1212
1236
1213
- fn prepare_enum_variant_enum (
1214
- variants : & [ Variant ] ,
1215
- cattrs : & attr:: Container ,
1216
- ) -> ( TokenStream , Stmts ) {
1237
+ fn prepare_enum_variant_enum ( variants : & [ Variant ] ) -> ( TokenStream , Stmts ) {
1217
1238
let mut deserialized_variants = variants
1218
1239
. iter ( )
1219
1240
. enumerate ( )
@@ -1247,7 +1268,7 @@ fn prepare_enum_variant_enum(
1247
1268
1248
1269
let variant_visitor = Stmts ( deserialize_generated_identifier (
1249
1270
& variant_names_idents,
1250
- cattrs ,
1271
+ false , // variant identifiers does not depend on the presence of flatten fields
1251
1272
true ,
1252
1273
None ,
1253
1274
fallthrough,
@@ -1270,7 +1291,7 @@ fn deserialize_externally_tagged_enum(
1270
1291
let expecting = format ! ( "enum {}" , params. type_name( ) ) ;
1271
1292
let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
1272
1293
1273
- let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants, cattrs ) ;
1294
+ let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants) ;
1274
1295
1275
1296
// Match arms to extract a variant from a string
1276
1297
let variant_arms = variants
@@ -1355,7 +1376,7 @@ fn deserialize_internally_tagged_enum(
1355
1376
cattrs : & attr:: Container ,
1356
1377
tag : & str ,
1357
1378
) -> Fragment {
1358
- let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants, cattrs ) ;
1379
+ let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants) ;
1359
1380
1360
1381
// Match arms to extract a variant from a string
1361
1382
let variant_arms = variants
@@ -1409,7 +1430,7 @@ fn deserialize_adjacently_tagged_enum(
1409
1430
split_with_de_lifetime ( params) ;
1410
1431
let delife = params. borrowed . de_lifetime ( ) ;
1411
1432
1412
- let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants, cattrs ) ;
1433
+ let ( variants_stmt, variant_visitor) = prepare_enum_variant_enum ( variants) ;
1413
1434
1414
1435
let variant_arms: & Vec < _ > = & variants
1415
1436
. iter ( )
@@ -1810,12 +1831,14 @@ fn deserialize_externally_tagged_variant(
1810
1831
params,
1811
1832
& variant. fields ,
1812
1833
cattrs,
1834
+ variant. attrs . has_flatten ( ) ,
1813
1835
TupleForm :: ExternallyTagged ( variant_ident) ,
1814
1836
) ,
1815
1837
Style :: Struct => deserialize_struct (
1816
1838
params,
1817
1839
& variant. fields ,
1818
1840
cattrs,
1841
+ variant. attrs . has_flatten ( ) ,
1819
1842
StructForm :: ExternallyTagged ( variant_ident) ,
1820
1843
) ,
1821
1844
}
@@ -1859,6 +1882,7 @@ fn deserialize_internally_tagged_variant(
1859
1882
params,
1860
1883
& variant. fields ,
1861
1884
cattrs,
1885
+ variant. attrs . has_flatten ( ) ,
1862
1886
StructForm :: InternallyTagged ( variant_ident, deserializer) ,
1863
1887
) ,
1864
1888
Style :: Tuple => unreachable ! ( "checked in serde_derive_internals" ) ,
@@ -1909,12 +1933,14 @@ fn deserialize_untagged_variant(
1909
1933
params,
1910
1934
& variant. fields ,
1911
1935
cattrs,
1936
+ variant. attrs . has_flatten ( ) ,
1912
1937
TupleForm :: Untagged ( variant_ident, deserializer) ,
1913
1938
) ,
1914
1939
Style :: Struct => deserialize_struct (
1915
1940
params,
1916
1941
& variant. fields ,
1917
1942
cattrs,
1943
+ variant. attrs . has_flatten ( ) ,
1918
1944
StructForm :: Untagged ( variant_ident, deserializer) ,
1919
1945
) ,
1920
1946
}
@@ -1985,7 +2011,7 @@ fn deserialize_untagged_newtype_variant(
1985
2011
1986
2012
fn deserialize_generated_identifier (
1987
2013
fields : & [ ( & str , Ident , & BTreeSet < String > ) ] ,
1988
- cattrs : & attr :: Container ,
2014
+ has_flatten : bool ,
1989
2015
is_variant : bool ,
1990
2016
ignore_variant : Option < TokenStream > ,
1991
2017
fallthrough : Option < TokenStream > ,
@@ -1999,11 +2025,11 @@ fn deserialize_generated_identifier(
1999
2025
is_variant,
2000
2026
fallthrough,
2001
2027
None ,
2002
- !is_variant && cattrs . has_flatten ( ) ,
2028
+ !is_variant && has_flatten,
2003
2029
None ,
2004
2030
) ) ;
2005
2031
2006
- let lifetime = if !is_variant && cattrs . has_flatten ( ) {
2032
+ let lifetime = if !is_variant && has_flatten {
2007
2033
Some ( quote ! ( <' de>) )
2008
2034
} else {
2009
2035
None
@@ -2043,8 +2069,9 @@ fn deserialize_generated_identifier(
2043
2069
fn deserialize_field_identifier (
2044
2070
fields : & [ ( & str , Ident , & BTreeSet < String > ) ] ,
2045
2071
cattrs : & attr:: Container ,
2072
+ has_flatten : bool ,
2046
2073
) -> Stmts {
2047
- let ( ignore_variant, fallthrough) = if cattrs . has_flatten ( ) {
2074
+ let ( ignore_variant, fallthrough) = if has_flatten {
2048
2075
let ignore_variant = quote ! ( __other( _serde:: __private:: de:: Content <' de>) , ) ;
2049
2076
let fallthrough = quote ! ( _serde:: __private:: Ok ( __Field:: __other( __value) ) ) ;
2050
2077
( Some ( ignore_variant) , Some ( fallthrough) )
@@ -2058,7 +2085,7 @@ fn deserialize_field_identifier(
2058
2085
2059
2086
Stmts ( deserialize_generated_identifier (
2060
2087
fields,
2061
- cattrs ,
2088
+ has_flatten ,
2062
2089
false ,
2063
2090
ignore_variant,
2064
2091
fallthrough,
@@ -2460,6 +2487,7 @@ fn deserialize_map(
2460
2487
params : & Parameters ,
2461
2488
fields : & [ Field ] ,
2462
2489
cattrs : & attr:: Container ,
2490
+ has_flatten : bool ,
2463
2491
) -> Fragment {
2464
2492
// Create the field names for the fields.
2465
2493
let fields_names: Vec < _ > = fields
@@ -2480,9 +2508,6 @@ fn deserialize_map(
2480
2508
} ) ;
2481
2509
2482
2510
// Collect contents for flatten fields into a buffer
2483
- let has_flatten = fields
2484
- . iter ( )
2485
- . any ( |field| field. attrs . flatten ( ) && !field. attrs . skip_deserializing ( ) ) ;
2486
2511
let let_collect = if has_flatten {
2487
2512
Some ( quote ! {
2488
2513
let mut __collect = _serde:: __private:: Vec :: <_serde:: __private:: Option <(
@@ -2681,7 +2706,10 @@ fn deserialize_map_in_place(
2681
2706
fields : & [ Field ] ,
2682
2707
cattrs : & attr:: Container ,
2683
2708
) -> Fragment {
2684
- assert ! ( !cattrs. has_flatten( ) ) ;
2709
+ assert ! (
2710
+ !cattrs. has_flatten( ) ,
2711
+ "inplace deserialization of maps doesn't support flatten fields"
2712
+ ) ;
2685
2713
2686
2714
// Create the field names for the fields.
2687
2715
let fields_names: Vec < _ > = fields
0 commit comments