@@ -966,25 +966,28 @@ fn deserialize_struct(
966
966
} ;
967
967
let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
968
968
969
- let field_idents_aliases : Vec < _ > = fields
969
+ let deserialized_fields : Vec < _ > = fields
970
970
. iter ( )
971
971
. enumerate ( )
972
972
// Skip fields that shouldn't be deserialized or that were flattened,
973
973
// so they don't appear in the storage in their literal form
974
974
. filter ( |& ( _, field) | !field. attrs . skip_deserializing ( ) && !field. attrs . flatten ( ) )
975
- . map ( |( i, field) | ( field_i ( i) , field. attrs . aliases ( ) ) )
975
+ . map ( |( i, field) | FieldWithAliases {
976
+ ident : field_i ( i) ,
977
+ aliases : field. attrs . aliases ( ) ,
978
+ } )
976
979
. collect ( ) ;
977
980
978
981
let has_flatten = has_flatten ( fields) ;
979
- let field_visitor = deserialize_field_identifier ( & field_idents_aliases , cattrs, has_flatten) ;
982
+ let field_visitor = deserialize_field_identifier ( & deserialized_fields , cattrs, has_flatten) ;
980
983
981
984
// untagged struct variants do not get a visit_seq method. The same applies to
982
985
// structs that only have a map representation.
983
986
let visit_seq = match form {
984
987
StructForm :: Untagged ( ..) => None ,
985
988
_ if has_flatten => None ,
986
989
_ => {
987
- let mut_seq = if field_idents_aliases . is_empty ( ) {
990
+ let mut_seq = if deserialized_fields . is_empty ( ) {
988
991
quote ! ( _)
989
992
} else {
990
993
quote ! ( mut __seq)
@@ -1032,9 +1035,7 @@ fn deserialize_struct(
1032
1035
let fields_stmt = if has_flatten {
1033
1036
None
1034
1037
} else {
1035
- let field_names = field_idents_aliases
1036
- . iter ( )
1037
- . flat_map ( |& ( _, aliases) | aliases) ;
1038
+ let field_names = deserialized_fields. iter ( ) . flat_map ( |field| field. aliases ) ;
1038
1039
1039
1040
Some ( quote ! {
1040
1041
#[ doc( hidden) ]
@@ -1127,25 +1128,26 @@ fn deserialize_struct_in_place(
1127
1128
let expecting = format ! ( "struct {}" , params. type_name( ) ) ;
1128
1129
let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
1129
1130
1130
- let field_idents_aliases : Vec < _ > = fields
1131
+ let deserialized_fields : Vec < _ > = fields
1131
1132
. iter ( )
1132
1133
. enumerate ( )
1133
1134
. filter ( |& ( _, field) | !field. attrs . skip_deserializing ( ) )
1134
- . map ( |( i, field) | ( field_i ( i) , field. attrs . aliases ( ) ) )
1135
+ . map ( |( i, field) | FieldWithAliases {
1136
+ ident : field_i ( i) ,
1137
+ aliases : field. attrs . aliases ( ) ,
1138
+ } )
1135
1139
. collect ( ) ;
1136
1140
1137
- let field_visitor = deserialize_field_identifier ( & field_idents_aliases , cattrs, false ) ;
1141
+ let field_visitor = deserialize_field_identifier ( & deserialized_fields , cattrs, false ) ;
1138
1142
1139
- let mut_seq = if field_idents_aliases . is_empty ( ) {
1143
+ let mut_seq = if deserialized_fields . is_empty ( ) {
1140
1144
quote ! ( _)
1141
1145
} else {
1142
1146
quote ! ( mut __seq)
1143
1147
} ;
1144
1148
let visit_seq = Stmts ( deserialize_seq_in_place ( params, fields, cattrs, expecting) ) ;
1145
1149
let visit_map = Stmts ( deserialize_map_in_place ( params, fields, cattrs) ) ;
1146
- let field_names = field_idents_aliases
1147
- . iter ( )
1148
- . flat_map ( |& ( _, aliases) | aliases) ;
1150
+ let field_names = deserialized_fields. iter ( ) . flat_map ( |field| field. aliases ) ;
1149
1151
let type_name = cattrs. name ( ) . deserialize_name ( ) ;
1150
1152
1151
1153
let in_place_impl_generics = de_impl_generics. in_place ( ) ;
@@ -1252,12 +1254,15 @@ fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) {
1252
1254
}
1253
1255
} ;
1254
1256
1255
- let variant_idents_aliases: Vec < _ > = deserialized_variants
1256
- . map ( |( i, variant) | ( field_i ( i) , variant. attrs . aliases ( ) ) )
1257
+ let deserialized_variants: Vec < _ > = deserialized_variants
1258
+ . map ( |( i, variant) | FieldWithAliases {
1259
+ ident : field_i ( i) ,
1260
+ aliases : variant. attrs . aliases ( ) ,
1261
+ } )
1257
1262
. collect ( ) ;
1258
1263
1259
1264
let variant_visitor = Stmts ( deserialize_generated_identifier (
1260
- & variant_idents_aliases ,
1265
+ & deserialized_variants ,
1261
1266
false , // variant identifiers do not depend on the presence of flatten fields
1262
1267
true ,
1263
1268
None ,
@@ -1994,22 +1999,27 @@ fn deserialize_untagged_newtype_variant(
1994
1999
}
1995
2000
}
1996
2001
2002
+ struct FieldWithAliases < ' a > {
2003
+ ident : Ident ,
2004
+ aliases : & ' a BTreeSet < String > ,
2005
+ }
2006
+
1997
2007
fn deserialize_generated_identifier (
1998
- field_idents_aliases : & [ ( Ident , & BTreeSet < String > ) ] ,
2008
+ deserialized_fields : & [ FieldWithAliases ] ,
1999
2009
has_flatten : bool ,
2000
2010
is_variant : bool ,
2001
2011
ignore_variant : Option < TokenStream > ,
2002
2012
fallthrough : Option < TokenStream > ,
2003
2013
) -> Fragment {
2004
2014
let this_value = quote ! ( __Field) ;
2005
- let field_idents: & Vec < _ > = & field_idents_aliases
2015
+ let field_idents: & Vec < _ > = & deserialized_fields
2006
2016
. iter ( )
2007
- . map ( |( ident , _ ) | ident)
2017
+ . map ( |field| & field . ident )
2008
2018
. collect ( ) ;
2009
2019
2010
2020
let visitor_impl = Stmts ( deserialize_identifier (
2011
2021
& this_value,
2012
- field_idents_aliases ,
2022
+ deserialized_fields ,
2013
2023
is_variant,
2014
2024
fallthrough,
2015
2025
None ,
@@ -2055,7 +2065,7 @@ fn deserialize_generated_identifier(
2055
2065
/// Generates enum and its `Deserialize` implementation that represents each
2056
2066
/// non-skipped field of the struct
2057
2067
fn deserialize_field_identifier (
2058
- field_idents_aliases : & [ ( Ident , & BTreeSet < String > ) ] ,
2068
+ deserialized_fields : & [ FieldWithAliases ] ,
2059
2069
cattrs : & attr:: Container ,
2060
2070
has_flatten : bool ,
2061
2071
) -> Stmts {
@@ -2072,7 +2082,7 @@ fn deserialize_field_identifier(
2072
2082
} ;
2073
2083
2074
2084
Stmts ( deserialize_generated_identifier (
2075
- field_idents_aliases ,
2085
+ deserialized_fields ,
2076
2086
has_flatten,
2077
2087
false ,
2078
2088
ignore_variant,
@@ -2132,10 +2142,13 @@ fn deserialize_custom_identifier(
2132
2142
2133
2143
let idents_aliases: Vec < _ > = ordinary
2134
2144
. iter ( )
2135
- . map ( |variant| ( variant. ident . clone ( ) , variant. attrs . aliases ( ) ) )
2145
+ . map ( |variant| FieldWithAliases {
2146
+ ident : variant. ident . clone ( ) ,
2147
+ aliases : variant. attrs . aliases ( ) ,
2148
+ } )
2136
2149
. collect ( ) ;
2137
2150
2138
- let names = idents_aliases. iter ( ) . flat_map ( |& ( _ , aliases ) | aliases) ;
2151
+ let names = idents_aliases. iter ( ) . flat_map ( |variant| variant . aliases ) ;
2139
2152
2140
2153
let names_const = if fallthrough. is_some ( ) {
2141
2154
None
@@ -2191,20 +2204,24 @@ fn deserialize_custom_identifier(
2191
2204
2192
2205
fn deserialize_identifier (
2193
2206
this_value : & TokenStream ,
2194
- field_idents_aliases : & [ ( Ident , & BTreeSet < String > ) ] ,
2207
+ deserialized_fields : & [ FieldWithAliases ] ,
2195
2208
is_variant : bool ,
2196
2209
fallthrough : Option < TokenStream > ,
2197
2210
fallthrough_borrowed : Option < TokenStream > ,
2198
2211
collect_other_fields : bool ,
2199
2212
expecting : Option < & str > ,
2200
2213
) -> Fragment {
2201
- let str_mapping = field_idents_aliases. iter ( ) . map ( |( ident, aliases) | {
2214
+ let str_mapping = deserialized_fields. iter ( ) . map ( |field| {
2215
+ let ident = & field. ident ;
2216
+ let aliases = field. aliases ;
2202
2217
// `aliases` also contains a main name
2203
2218
quote ! ( #( #aliases) |* => _serde:: __private:: Ok ( #this_value:: #ident) )
2204
2219
} ) ;
2205
- let bytes_mapping = field_idents_aliases. iter ( ) . map ( |( ident, aliases) | {
2220
+ let bytes_mapping = deserialized_fields. iter ( ) . map ( |field| {
2221
+ let ident = & field. ident ;
2206
2222
// `aliases` also contains a main name
2207
- let aliases = aliases
2223
+ let aliases = field
2224
+ . aliases
2208
2225
. iter ( )
2209
2226
. map ( |alias| Literal :: byte_string ( alias. as_bytes ( ) ) ) ;
2210
2227
quote ! ( #( #aliases) |* => _serde:: __private:: Ok ( #this_value:: #ident) )
@@ -2357,13 +2374,11 @@ fn deserialize_identifier(
2357
2374
}
2358
2375
}
2359
2376
} else {
2360
- let u64_mapping = field_idents_aliases
2361
- . iter ( )
2362
- . enumerate ( )
2363
- . map ( |( i, ( ident, _) ) | {
2364
- let i = i as u64 ;
2365
- quote ! ( #i => _serde:: __private:: Ok ( #this_value:: #ident) )
2366
- } ) ;
2377
+ let u64_mapping = deserialized_fields. iter ( ) . enumerate ( ) . map ( |( i, field) | {
2378
+ let i = i as u64 ;
2379
+ let ident = & field. ident ;
2380
+ quote ! ( #i => _serde:: __private:: Ok ( #this_value:: #ident) )
2381
+ } ) ;
2367
2382
2368
2383
let u64_fallthrough_arm_tokens;
2369
2384
let u64_fallthrough_arm = if let Some ( fallthrough) = & fallthrough {
@@ -2373,7 +2388,7 @@ fn deserialize_identifier(
2373
2388
let fallthrough_msg = format ! (
2374
2389
"{} index 0 <= i < {}" ,
2375
2390
index_expecting,
2376
- field_idents_aliases . len( ) ,
2391
+ deserialized_fields . len( ) ,
2377
2392
) ;
2378
2393
u64_fallthrough_arm_tokens = quote ! {
2379
2394
_serde:: __private:: Err ( _serde:: de:: Error :: invalid_value(
0 commit comments