From d9e894911f94f6935fe2697252ba0a868aa90924 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 10 Dec 2017 23:12:54 -0800 Subject: [PATCH] Move all the deserialize_from derive code behind flag --- serde_derive/src/de.rs | 45 ++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 58d97c63..361caad0 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -40,18 +40,7 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result(&mut self, __deserializer: __D) -> _serde::export::Result<(), __D::Error> - where __D: _serde::Deserializer<#delife> - { - #from_body - } - } - }); + let fn_deserialize_from = deserialize_from_body(&cont, ¶ms); quote! { #[automatically_derived] @@ -62,7 +51,7 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result Fragment { } #[cfg(feature = "deserialize_from")] -fn deserialize_from_body(cont: &Container, params: &Parameters) -> Option { +fn deserialize_from_body(cont: &Container, params: &Parameters) -> Option { // Only remote derives have getters, and we do not generate deserialize_from // for remote derives. assert!(!params.has_getter); @@ -273,21 +262,35 @@ fn deserialize_from_body(cont: &Container, params: &Parameters) -> Option None, + let code = match cont.body { Body::Struct(Style::Struct, ref fields) => { - Some(deserialize_from_struct(None, params, fields, &cont.attrs, None, Untagged::No)) + deserialize_from_struct(None, params, fields, &cont.attrs, None, Untagged::No) } Body::Struct(Style::Tuple, ref fields) | Body::Struct(Style::Newtype, ref fields) => { - Some(deserialize_from_tuple(None, params, fields, &cont.attrs, None)) + deserialize_from_tuple(None, params, fields, &cont.attrs, None) } - Body::Struct(Style::Unit, _) => None, - } + Body::Enum(_) | Body::Struct(Style::Unit, _) => { + return None; + } + }; + + let delife = params.borrowed.de_lifetime(); + let stmts = Stmts(code); + + let fn_deserialize_from = quote_block! { + fn deserialize_from<__D>(&mut self, __deserializer: __D) -> _serde::export::Result<(), __D::Error> + where __D: _serde::Deserializer<#delife> + { + #stmts + } + }; + + Some(Stmts(fn_deserialize_from)) } #[cfg(not(feature = "deserialize_from"))] -fn deserialize_from_body(_cont: &Container, _params: &Parameters) -> Option { +fn deserialize_from_body(_cont: &Container, _params: &Parameters) -> Option { None }