From 6d1807bb4a2a2dd9811c2c954810ee7e8dd32f7f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 21 Apr 2018 11:41:37 -0700 Subject: [PATCH] Improve Serialize of adjacently tagged newtype variants The existing implementation was unnecessarily complicated. struct __AdjacentlyTagged<'__a> { data: (&'__a String,), phantom: _serde::export::PhantomData, } impl<'__a> _serde::Serialize for __AdjacentlyTagged<'__a> { fn serialize<__S>( &self, __serializer: __S, ) -> _serde::export::Result<__S::Ok, __S::Error> where __S: _serde::Serializer, { let (__field0,) = self.data; _serde::Serialize::serialize(__field0, __serializer) } } _serde::ser::SerializeStruct::serialize_field( &mut __struct, "content", &__AdjacentlyTagged { data: (__field0,), phantom: _serde::export::PhantomData::, }, )?; Instead the new implementation does simply: _serde::ser::SerializeStruct::serialize_field( &mut __struct, "content", __field0, )?; --- serde_derive/src/ser.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index e5c1b000..802aaf5c 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -596,9 +596,15 @@ fn serialize_adjacently_tagged_variant( field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr); } - quote_expr! { - _serde::Serialize::serialize(#field_expr, __serializer) - } + return quote_block! { + let mut __struct = try!(_serde::Serializer::serialize_struct( + __serializer, #type_name, 2)); + try!(_serde::ser::SerializeStruct::serialize_field( + &mut __struct, #tag, #variant_name)); + try!(_serde::ser::SerializeStruct::serialize_field( + &mut __struct, #content, #field_expr)); + _serde::ser::SerializeStruct::end(__struct) + }; } Style::Tuple => { serialize_tuple_variant(TupleVariant::Untagged, params, &variant.fields)