From 6a8c39b2aa356e4c115c5f5c8409880c6c3358f1 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 21 Apr 2018 10:51:32 -0700 Subject: [PATCH 1/2] More efficient try!() alternative --- serde_derive/src/de.rs | 3 +++ serde_derive/src/lib.rs | 1 + serde_derive/src/ser.rs | 3 +++ serde_derive/src/try.rs | 25 +++++++++++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 serde_derive/src/try.rs diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index b7eab3ab..3e2ae61a 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -16,6 +16,7 @@ use bound; use fragment::{Expr, Fragment, Match, Stmts}; use internals::ast::{Container, Data, Field, Style, Variant}; use internals::{self, attr}; +use try; use std::collections::BTreeSet; @@ -63,10 +64,12 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result TokenStream { diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index cf7db09b..992084f6 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -15,6 +15,7 @@ use bound; use fragment::{Fragment, Match, Stmts}; use internals::ast::{Container, Data, Field, Style, Variant}; use internals::{attr, Ctxt}; +use try; use std::u32; @@ -55,10 +56,12 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result Tokens { + // Cannot pass `$expr` to `quote!` prior to Rust 1.17.0 so interpolate it. + let dollar = Op::new('$', Spacing::Alone); + + quote! { + #[allow(unused_macros)] + macro_rules! try { + (#dollar __expr:expr) => { + match #dollar __expr { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } + } + } + } +} From 607966dcf7eb00f6ccde1ba7c945c5bf970d8d7b Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 21 Apr 2018 11:21:13 -0700 Subject: [PATCH 2/2] Fix error message type inference in compile-fail/remote/wrong_de.rs --- serde_derive/src/de.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 3e2ae61a..8f4e1ee8 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -735,7 +735,7 @@ fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &F } }; - let mut result = quote_spanned!(Span::call_site()=> #type_path(#value)); + let mut result = quote_spanned!(Span::call_site()=> #type_path(__field0)); if params.has_getter { let this = ¶ms.this; result = quote! { @@ -748,6 +748,7 @@ fn deserialize_newtype_struct(type_path: &Tokens, params: &Parameters, field: &F fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::export::Result where __E: _serde::Deserializer<#delife> { + let __field0 = #value; _serde::export::Ok(#result) } }