From aa86b04714fd37044e46535387ffcd7974f6e625 Mon Sep 17 00:00:00 2001 From: Jeroen Bollen Date: Fri, 8 Dec 2017 15:13:05 +0100 Subject: [PATCH] Adressed concerns raised by @oli-obk. Specifically: - Change identation in `de.rs`. - Make `attr::Field` take a `attr::Default` as opposed to the entire parent `attr::Container`. --- serde_derive/src/de.rs | 16 ++++++++-------- serde_derive_internals/src/ast.rs | 23 +++++++++++++---------- serde_derive_internals/src/attr.rs | 4 ++-- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 26afef55..2012c10b 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -451,15 +451,15 @@ fn deserialize_seq( attr::Default::Default => { Some( quote!( - let __default: Self::Value = _serde::export::Default::default(); - ), + let __default: Self::Value = _serde::export::Default::default(); + ), ) } attr::Default::Path(ref path) => { Some( quote!( - let __default: Self::Value = #path(); - ), + let __default: Self::Value = #path(); + ), ) } attr::Default::None => { @@ -1724,15 +1724,15 @@ fn deserialize_map( attr::Default::Default => { Some( quote!( - let __default: Self::Value = _serde::export::Default::default(); - ), + let __default: Self::Value = _serde::export::Default::default(); + ), ) } attr::Default::Path(ref path) => { Some( quote!( - let __default: Self::Value = #path(); - ), + let __default: Self::Value = #path(); + ), ) } attr::Default::None => { diff --git a/serde_derive_internals/src/ast.rs b/serde_derive_internals/src/ast.rs index 5f8b8aae..83243bcb 100644 --- a/serde_derive_internals/src/ast.rs +++ b/serde_derive_internals/src/ast.rs @@ -49,9 +49,11 @@ impl<'a> Container<'a> { let attrs = attr::Container::from_ast(cx, item); let mut body = match item.body { - syn::Body::Enum(ref variants) => Body::Enum(enum_from_ast(cx, variants, &attrs)), + syn::Body::Enum(ref variants) => { + Body::Enum(enum_from_ast(cx, variants, &attrs.default())) + } syn::Body::Struct(ref variant_data) => { - let (style, fields) = struct_from_ast(cx, variant_data, None, &attrs); + let (style, fields) = struct_from_ast(cx, variant_data, None, &attrs.default()); Body::Struct(style, fields) } }; @@ -101,13 +103,14 @@ impl<'a> Body<'a> { fn enum_from_ast<'a>( cx: &Ctxt, variants: &'a [syn::Variant], - container: &attr::Container, + container_default: &attr::Default, ) -> Vec> { variants .iter() .map(|variant| { let attrs = attr::Variant::from_ast(cx, variant); - let (style, fields) = struct_from_ast(cx, &variant.data, Some(&attrs), container); + let (style, fields) = + struct_from_ast(cx, &variant.data, Some(&attrs), container_default); Variant { ident: variant.ident.clone(), attrs: attrs, @@ -122,18 +125,18 @@ fn struct_from_ast<'a>( cx: &Ctxt, data: &'a syn::VariantData, attrs: Option<&attr::Variant>, - container: &attr::Container, + container_default: &attr::Default, ) -> (Style, Vec>) { match *data { syn::VariantData::Struct(ref fields) => { - (Style::Struct, fields_from_ast(cx, fields, attrs, container)) + (Style::Struct, fields_from_ast(cx, fields, attrs, container_default)) } syn::VariantData::Tuple(ref fields) if fields.len() == 1 => ( Style::Newtype, - fields_from_ast(cx, fields, attrs, container), + fields_from_ast(cx, fields, attrs, container_default), ), syn::VariantData::Tuple(ref fields) => { - (Style::Tuple, fields_from_ast(cx, fields, attrs, container)) + (Style::Tuple, fields_from_ast(cx, fields, attrs, container_default)) } syn::VariantData::Unit => (Style::Unit, Vec::new()), } @@ -143,7 +146,7 @@ fn fields_from_ast<'a>( cx: &Ctxt, fields: &'a [syn::Field], attrs: Option<&attr::Variant>, - container: &attr::Container, + container_default: &attr::Default, ) -> Vec> { fields .iter() @@ -152,7 +155,7 @@ fn fields_from_ast<'a>( |(i, field)| { Field { ident: field.ident.clone(), - attrs: attr::Field::from_ast(cx, i, field, attrs, container), + attrs: attr::Field::from_ast(cx, i, field, attrs, container_default), ty: &field.ty, } }, diff --git a/serde_derive_internals/src/attr.rs b/serde_derive_internals/src/attr.rs index 0cf43047..d93257c6 100644 --- a/serde_derive_internals/src/attr.rs +++ b/serde_derive_internals/src/attr.rs @@ -719,7 +719,7 @@ impl Field { index: usize, field: &syn::Field, attrs: Option<&Variant>, - container: &Container, + container_default: &Default, ) -> Self { let mut ser_name = Attr::none(cx, "rename"); let mut de_name = Attr::none(cx, "rename"); @@ -890,7 +890,7 @@ impl Field { // Is skip_deserializing, initialize the field to Default::default() unless a different // default is specified by `#[serde(default = "...")]` on ourselves or our container (e.g. // the struct we are in). - if container.default == Default::None && skip_deserializing.0.value.is_some() { + if container_default == &Default::None && skip_deserializing.0.value.is_some() { default.set_if_none(Default::Default); }