Hygiene for macro-generated newtype struct deserialization with 'with' attr

This commit is contained in:
David Tolnay
2024-10-22 11:10:40 -07:00
parent fdc36e5c06
commit b60e4092ec
+4 -3
View File
@@ -875,13 +875,14 @@ fn deserialize_newtype_struct(
) -> TokenStream { ) -> TokenStream {
let delife = params.borrowed.de_lifetime(); let delife = params.borrowed.de_lifetime();
let field_ty = field.ty; let field_ty = field.ty;
let deserializer_var = quote!(__e);
let value = match field.attrs.deserialize_with() { let value = match field.attrs.deserialize_with() {
None => { None => {
let span = field.original.span(); let span = field.original.span();
let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize); let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
quote! { quote! {
#func(__e)? #func(#deserializer_var)?
} }
} }
Some(path) => { Some(path) => {
@@ -890,7 +891,7 @@ fn deserialize_newtype_struct(
// on the #[serde(with = "...")] // on the #[serde(with = "...")]
// ^^^^^ // ^^^^^
quote_spanned! {path.span()=> quote_spanned! {path.span()=>
#path(__e)? #path(#deserializer_var)?
} }
} }
}; };
@@ -906,7 +907,7 @@ fn deserialize_newtype_struct(
quote! { quote! {
#[inline] #[inline]
fn visit_newtype_struct<__E>(self, __e: __E) -> _serde::__private::Result<Self::Value, __E::Error> fn visit_newtype_struct<__E>(self, #deserializer_var: __E) -> _serde::__private::Result<Self::Value, __E::Error>
where where
__E: _serde::Deserializer<#delife>, __E: _serde::Deserializer<#delife>,
{ {