} else {
quote! { ::rustc_serialize::Decodable::decode }
};
- let (decode_method, opt_field_name) = if is_struct {
+ let __decoder = quote! { __decoder };
+ let decode_call = if is_struct {
let field_name = field.ident.as_ref().map_or_else(|| index.to_string(), |i| i.to_string());
- (proc_macro2::Ident::new("read_struct_field", field_span), quote! { #field_name, })
+ let decode_method = proc_macro2::Ident::new("read_struct_field", field_span);
+ // Use the span of the field for the method call, so
+ // that backtraces will point to the field.
+ quote_spanned! {field_span=>
+ ::rustc_serialize::Decoder::#decode_method(
+ #__decoder, #field_name, #decode_inner_method)
+ }
} else {
- (proc_macro2::Ident::new("read_enum_variant_arg", field_span), quote! {})
- };
-
- let __decoder = quote! { __decoder };
- // Use the span of the field for the method call, so
- // that backtraces will point to the field.
- let decode_call = quote_spanned! {field_span=>
- ::rustc_serialize::Decoder::#decode_method(
- #__decoder, #opt_field_name #decode_inner_method)
+ // Use the span of the field for the method call, so
+ // that backtraces will point to the field.
+ quote_spanned! {field_span=> #decode_inner_method(#__decoder) }
};
quote! { #decode_call }
f(self, disr)
}
- #[inline]
- fn read_enum_variant_arg<T, F>(&mut self, f: F) -> T
- where
- F: FnOnce(&mut Self) -> T,
- {
- f(self)
- }
-
#[inline]
fn read_struct<T, F>(&mut self, f: F) -> T
where
impl<D: Decoder, T1: Decodable<D>, T2: Decodable<D>> Decodable<D> for Result<T1, T2> {
fn decode(d: &mut D) -> Result<T1, T2> {
d.read_enum_variant(|d, disr| match disr {
- 0 => Ok(d.read_enum_variant_arg(|d| T1::decode(d))),
- 1 => Err(d.read_enum_variant_arg(|d| T2::decode(d))),
+ 0 => Ok(T1::decode(d)),
+ 1 => Err(T2::decode(d)),
_ => panic!("Encountered invalid discriminant while decoding `Result`."),
})
}