@@ -324,10 +324,10 @@ fn deserialize_in_place_body(cont: &Container, params: &Parameters) -> Option<St
324
324
325
325
let code = match & cont. data {
326
326
Data :: Struct ( Style :: Struct , fields) => {
327
- deserialize_struct_in_place ( None , params, fields, & cont. attrs , None ) ?
327
+ deserialize_struct_in_place ( params, fields, & cont. attrs ) ?
328
328
}
329
329
Data :: Struct ( Style :: Tuple , fields) | Data :: Struct ( Style :: Newtype , fields) => {
330
- deserialize_tuple_in_place ( None , params, fields, & cont. attrs , None )
330
+ deserialize_tuple_in_place ( params, fields, & cont. attrs )
331
331
}
332
332
Data :: Enum ( _) | Data :: Struct ( Style :: Unit , _) => {
333
333
return None ;
@@ -582,11 +582,9 @@ fn deserialize_tuple(
582
582
583
583
#[ cfg( feature = "deserialize_in_place" ) ]
584
584
fn deserialize_tuple_in_place (
585
- variant_ident : Option < syn:: Ident > ,
586
585
params : & Parameters ,
587
586
fields : & [ Field ] ,
588
587
cattrs : & attr:: Container ,
589
- deserializer : Option < TokenStream > ,
590
588
) -> Fragment {
591
589
assert ! ( !cattrs. has_flatten( ) ) ;
592
590
@@ -600,17 +598,25 @@ fn deserialize_tuple_in_place(
600
598
split_with_de_lifetime ( params) ;
601
599
let delife = params. borrowed . de_lifetime ( ) ;
602
600
603
- let is_enum = variant_ident. is_some ( ) ;
604
- let expecting = match variant_ident {
605
- Some ( variant_ident) => format ! ( "tuple variant {}::{}" , params. type_name( ) , variant_ident) ,
606
- None => format ! ( "tuple struct {}" , params. type_name( ) ) ,
607
- } ;
601
+ let expecting = format ! ( "tuple struct {}" , params. type_name( ) ) ;
608
602
let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
609
603
610
604
let nfields = fields. len ( ) ;
611
605
612
- let visit_newtype_struct = if !is_enum && nfields == 1 {
613
- Some ( deserialize_newtype_struct_in_place ( params, & fields[ 0 ] ) )
606
+ let visit_newtype_struct = if nfields == 1 {
607
+ // We do not generate deserialize_in_place if every field has a
608
+ // deserialize_with.
609
+ assert ! ( fields[ 0 ] . attrs. deserialize_with( ) . is_none( ) ) ;
610
+
611
+ Some ( quote ! {
612
+ #[ inline]
613
+ fn visit_newtype_struct<__E>( self , __e: __E) -> _serde:: __private:: Result <Self :: Value , __E:: Error >
614
+ where
615
+ __E: _serde:: Deserializer <#delife>,
616
+ {
617
+ _serde:: Deserialize :: deserialize_in_place( __e, & mut self . place. 0 )
618
+ }
619
+ } )
614
620
} else {
615
621
None
616
622
} ;
@@ -624,15 +630,10 @@ fn deserialize_tuple_in_place(
624
630
}
625
631
} ;
626
632
627
- let dispatch = if let Some ( deserializer) = deserializer {
628
- quote ! ( _serde:: Deserializer :: deserialize_tuple( #deserializer, #field_count, #visitor_expr) )
629
- } else if is_enum {
630
- quote ! ( _serde:: de:: VariantAccess :: tuple_variant( __variant, #field_count, #visitor_expr) )
631
- } else if nfields == 1 {
632
- let type_name = cattrs. name ( ) . deserialize_name ( ) ;
633
+ let type_name = cattrs. name ( ) . deserialize_name ( ) ;
634
+ let dispatch = if nfields == 1 {
633
635
quote ! ( _serde:: Deserializer :: deserialize_newtype_struct( __deserializer, #type_name, #visitor_expr) )
634
636
} else {
635
- let type_name = cattrs. name ( ) . deserialize_name ( ) ;
636
637
quote ! ( _serde:: Deserializer :: deserialize_tuple_struct( __deserializer, #type_name, #field_count, #visitor_expr) )
637
638
} ;
638
639
@@ -918,25 +919,6 @@ fn deserialize_newtype_struct(
918
919
}
919
920
}
920
921
921
- #[ cfg( feature = "deserialize_in_place" ) ]
922
- fn deserialize_newtype_struct_in_place ( params : & Parameters , field : & Field ) -> TokenStream {
923
- // We do not generate deserialize_in_place if every field has a
924
- // deserialize_with.
925
- assert ! ( field. attrs. deserialize_with( ) . is_none( ) ) ;
926
-
927
- let delife = params. borrowed . de_lifetime ( ) ;
928
-
929
- quote ! {
930
- #[ inline]
931
- fn visit_newtype_struct<__E>( self , __e: __E) -> _serde:: __private:: Result <Self :: Value , __E:: Error >
932
- where
933
- __E: _serde:: Deserializer <#delife>,
934
- {
935
- _serde:: Deserialize :: deserialize_in_place( __e, & mut self . place. 0 )
936
- }
937
- }
938
- }
939
-
940
922
enum StructForm < ' a > {
941
923
Struct ,
942
924
/// Contains a variant name
@@ -1133,14 +1115,10 @@ fn deserialize_struct(
1133
1115
1134
1116
#[ cfg( feature = "deserialize_in_place" ) ]
1135
1117
fn deserialize_struct_in_place (
1136
- variant_ident : Option < syn:: Ident > ,
1137
1118
params : & Parameters ,
1138
1119
fields : & [ Field ] ,
1139
1120
cattrs : & attr:: Container ,
1140
- deserializer : Option < TokenStream > ,
1141
1121
) -> Option < Fragment > {
1142
- let is_enum = variant_ident. is_some ( ) ;
1143
-
1144
1122
// for now we do not support in_place deserialization for structs that
1145
1123
// are represented as map.
1146
1124
if cattrs. has_flatten ( ) {
@@ -1152,58 +1130,40 @@ fn deserialize_struct_in_place(
1152
1130
split_with_de_lifetime ( params) ;
1153
1131
let delife = params. borrowed . de_lifetime ( ) ;
1154
1132
1155
- let expecting = match variant_ident {
1156
- Some ( variant_ident) => format ! ( "struct variant {}::{}" , params. type_name( ) , variant_ident) ,
1157
- None => format ! ( "struct {}" , params. type_name( ) ) ,
1158
- } ;
1133
+ let expecting = format ! ( "struct {}" , params. type_name( ) ) ;
1159
1134
let expecting = cattrs. expecting ( ) . unwrap_or ( & expecting) ;
1160
1135
1161
- let visit_seq = Stmts ( deserialize_seq_in_place ( params, fields, cattrs, expecting) ) ;
1162
-
1163
- let ( field_visitor, fields_stmt, visit_map) =
1164
- deserialize_struct_as_struct_in_place_visitor ( params, fields, cattrs) ;
1165
-
1166
- let field_visitor = Stmts ( field_visitor) ;
1167
- let fields_stmt = Stmts ( fields_stmt) ;
1168
- let visit_map = Stmts ( visit_map) ;
1136
+ let field_names_idents: Vec < _ > = fields
1137
+ . iter ( )
1138
+ . enumerate ( )
1139
+ . filter ( |& ( _, field) | !field. attrs . skip_deserializing ( ) )
1140
+ . map ( |( i, field) | {
1141
+ (
1142
+ field. attrs . name ( ) . deserialize_name ( ) ,
1143
+ field_i ( i) ,
1144
+ field. attrs . aliases ( ) ,
1145
+ )
1146
+ } )
1147
+ . collect ( ) ;
1169
1148
1170
- let visitor_expr = quote ! {
1171
- __Visitor {
1172
- place: __place,
1173
- lifetime: _serde:: __private:: PhantomData ,
1174
- }
1175
- } ;
1176
- let dispatch = if let Some ( deserializer) = deserializer {
1177
- quote ! {
1178
- _serde:: Deserializer :: deserialize_any( #deserializer, #visitor_expr)
1179
- }
1180
- } else if is_enum {
1181
- quote ! {
1182
- _serde:: de:: VariantAccess :: struct_variant( __variant, FIELDS , #visitor_expr)
1183
- }
1184
- } else {
1185
- let type_name = cattrs. name ( ) . deserialize_name ( ) ;
1186
- quote ! {
1187
- _serde:: Deserializer :: deserialize_struct( __deserializer, #type_name, FIELDS , #visitor_expr)
1188
- }
1189
- } ;
1149
+ let field_visitor = Stmts ( deserialize_generated_identifier (
1150
+ & field_names_idents,
1151
+ cattrs,
1152
+ false ,
1153
+ None ,
1154
+ ) ) ;
1190
1155
1191
- let all_skipped = fields. iter ( ) . all ( |field| field. attrs . skip_deserializing ( ) ) ;
1192
- let visitor_var = if all_skipped {
1156
+ let mut_seq = if field_names_idents. is_empty ( ) {
1193
1157
quote ! ( _)
1194
1158
} else {
1195
1159
quote ! ( mut __seq)
1196
1160
} ;
1197
-
1198
- let visit_seq = quote ! {
1199
- #[ inline]
1200
- fn visit_seq<__A>( self , #visitor_var: __A) -> _serde:: __private:: Result <Self :: Value , __A:: Error >
1201
- where
1202
- __A: _serde:: de:: SeqAccess <#delife>,
1203
- {
1204
- #visit_seq
1205
- }
1206
- } ;
1161
+ let visit_seq = Stmts ( deserialize_seq_in_place ( params, fields, cattrs, expecting) ) ;
1162
+ let visit_map = Stmts ( deserialize_map_in_place ( params, fields, cattrs) ) ;
1163
+ let field_names = field_names_idents
1164
+ . iter ( )
1165
+ . flat_map ( |( _, _, aliases) | aliases) ;
1166
+ let type_name = cattrs. name ( ) . deserialize_name ( ) ;
1207
1167
1208
1168
let in_place_impl_generics = de_impl_generics. in_place ( ) ;
1209
1169
let in_place_ty_generics = de_ty_generics. in_place ( ) ;
@@ -1225,7 +1185,13 @@ fn deserialize_struct_in_place(
1225
1185
_serde:: __private:: Formatter :: write_str( __formatter, #expecting)
1226
1186
}
1227
1187
1228
- #visit_seq
1188
+ #[ inline]
1189
+ fn visit_seq<__A>( self , #mut_seq: __A) -> _serde:: __private:: Result <Self :: Value , __A:: Error >
1190
+ where
1191
+ __A: _serde:: de:: SeqAccess <#delife>,
1192
+ {
1193
+ #visit_seq
1194
+ }
1229
1195
1230
1196
#[ inline]
1231
1197
fn visit_map<__A>( self , mut __map: __A) -> _serde:: __private:: Result <Self :: Value , __A:: Error >
@@ -1236,9 +1202,13 @@ fn deserialize_struct_in_place(
1236
1202
}
1237
1203
}
1238
1204
1239
- #fields_stmt
1205
+ #[ doc( hidden) ]
1206
+ const FIELDS : & ' static [ & ' static str ] = & [ #( #field_names) , * ] ;
1240
1207
1241
- #dispatch
1208
+ _serde:: Deserializer :: deserialize_struct( __deserializer, #type_name, FIELDS , __Visitor {
1209
+ place: __place,
1210
+ lifetime: _serde:: __private:: PhantomData ,
1211
+ } )
1242
1212
} )
1243
1213
}
1244
1214
@@ -2707,42 +2677,6 @@ fn deserialize_map(
2707
2677
}
2708
2678
}
2709
2679
2710
- #[ cfg( feature = "deserialize_in_place" ) ]
2711
- fn deserialize_struct_as_struct_in_place_visitor (
2712
- params : & Parameters ,
2713
- fields : & [ Field ] ,
2714
- cattrs : & attr:: Container ,
2715
- ) -> ( Fragment , Fragment , Fragment ) {
2716
- assert ! ( !cattrs. has_flatten( ) ) ;
2717
-
2718
- let field_names_idents: Vec < _ > = fields
2719
- . iter ( )
2720
- . enumerate ( )
2721
- . filter ( |& ( _, field) | !field. attrs . skip_deserializing ( ) )
2722
- . map ( |( i, field) | {
2723
- (
2724
- field. attrs . name ( ) . deserialize_name ( ) ,
2725
- field_i ( i) ,
2726
- field. attrs . aliases ( ) ,
2727
- )
2728
- } )
2729
- . collect ( ) ;
2730
-
2731
- let fields_stmt = {
2732
- let field_names = field_names_idents. iter ( ) . map ( |( name, _, _) | name) ;
2733
- quote_block ! {
2734
- #[ doc( hidden) ]
2735
- const FIELDS : & ' static [ & ' static str ] = & [ #( #field_names) , * ] ;
2736
- }
2737
- } ;
2738
-
2739
- let field_visitor = deserialize_generated_identifier ( & field_names_idents, cattrs, false , None ) ;
2740
-
2741
- let visit_map = deserialize_map_in_place ( params, fields, cattrs) ;
2742
-
2743
- ( field_visitor, fields_stmt, visit_map)
2744
- }
2745
-
2746
2680
#[ cfg( feature = "deserialize_in_place" ) ]
2747
2681
fn deserialize_map_in_place (
2748
2682
params : & Parameters ,
0 commit comments