Fix differences in the generated code

This commit is contained in:
David Tolnay
2016-09-27 01:04:11 -07:00
parent 9a86e6818f
commit effa298871
4 changed files with 37 additions and 21 deletions
+2 -2
View File
@@ -22,8 +22,8 @@ with-syn = []
[dependencies] [dependencies]
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
quote = "0.1" quote = "0.2"
serde_codegen_internals = { version = "=0.8.9", default-features = false, path = "../serde_codegen_internals" } serde_codegen_internals = { version = "=0.8.9", default-features = false, path = "../serde_codegen_internals" }
syn = { version = "0.7.1", features = ["aster", "visit"] } syn = { version = "0.8", features = ["aster", "visit"] }
syntex = { version = "^0.44.0", optional = true } syntex = { version = "^0.44.0", optional = true }
syntex_syntax = { version = "^0.44.0", optional = true } syntex_syntax = { version = "^0.44.0", optional = true }
+18 -13
View File
@@ -36,9 +36,7 @@ pub fn expand_derive_deserialize(item: &syn::MacroInput) -> Result<Tokens, Strin
impl #impl_generics _serde::de::Deserialize for #ty #where_clause { impl #impl_generics _serde::de::Deserialize for #ty #where_clause {
fn deserialize<__D>(deserializer: &mut __D) -> ::std::result::Result<#ty, __D::Error> fn deserialize<__D>(deserializer: &mut __D) -> ::std::result::Result<#ty, __D::Error>
where __D: _serde::de::Deserializer where __D: _serde::de::Deserializer
{ #body
#body
}
} }
}; };
}) })
@@ -151,6 +149,8 @@ fn deserialize_visitor(generics: &syn::Generics) -> (Tokens, Tokens, Tokens) {
quote!(__Visitor), quote!(__Visitor),
) )
} else { } else {
let where_clause = &generics.where_clause;
let num_phantoms = generics.lifetimes.len() + generics.ty_params.len(); let num_phantoms = generics.lifetimes.len() + generics.ty_params.len();
let phantom_types = generics.lifetimes.iter() let phantom_types = generics.lifetimes.iter()
@@ -190,7 +190,7 @@ fn deserialize_visitor(generics: &syn::Generics) -> (Tokens, Tokens, Tokens) {
( (
quote! { quote! {
struct __Visitor #generics ( #(phantom_types),* ); struct __Visitor #generics ( #(phantom_types),* ) #where_clause;
}, },
quote!(__Visitor <#(all_params),*> ), quote!(__Visitor <#(all_params),*> ),
quote!(__Visitor #ty_param_idents ( #(phantom_exprs),* )), quote!(__Visitor #ty_param_idents ( #(phantom_exprs),* )),
@@ -204,7 +204,7 @@ fn deserialize_unit_struct(
) -> Tokens { ) -> Tokens {
let type_name = item_attrs.name().deserialize_name(); let type_name = item_attrs.name().deserialize_name();
quote! { quote!({
struct __Visitor; struct __Visitor;
impl _serde::de::Visitor for __Visitor { impl _serde::de::Visitor for __Visitor {
@@ -227,7 +227,7 @@ fn deserialize_unit_struct(
} }
deserializer.deserialize_unit_struct(#type_name, __Visitor) deserializer.deserialize_unit_struct(#type_name, __Visitor)
} })
} }
fn deserialize_tuple( fn deserialize_tuple(
@@ -537,7 +537,7 @@ fn deserialize_item_enum(
let (visitor_item, visitor_ty, visitor_expr) = deserialize_visitor(impl_generics); let (visitor_item, visitor_ty, visitor_expr) = deserialize_visitor(impl_generics);
quote! { quote!({
#variant_visitor #variant_visitor
#visitor_item #visitor_item
@@ -557,7 +557,7 @@ fn deserialize_item_enum(
#variants_stmt #variants_stmt
deserializer.deserialize_enum(#type_name, VARIANTS, #visitor_expr) deserializer.deserialize_enum(#type_name, VARIANTS, #visitor_expr)
} })
} }
fn deserialize_variant( fn deserialize_variant(
@@ -628,9 +628,11 @@ fn deserialize_newtype_variant(
}) })
} }
}; };
quote! { // The outer braces are unnecessary but quasi used to have them. We can
Ok(#type_ident::#variant_ident(#visit)), // remove them separately from the syn conversion.
} quote!({
Ok(#type_ident::#variant_ident(#visit))
})
} }
fn deserialize_field_visitor( fn deserialize_field_visitor(
@@ -861,11 +863,14 @@ fn deserialize_map(
Some(path) => { Some(path) => {
let (wrapper, wrapper_impl, wrapper_ty) = wrap_deserialize_with( let (wrapper, wrapper_impl, wrapper_ty) = wrap_deserialize_with(
type_ident, impl_generics, field.ty, path); type_ident, impl_generics, field.ty, path);
quote!({ // The outer parentheses are redundant but quasi used to put
// them in. We can remove them separately from the syn
// conversion.
quote!(({
#wrapper #wrapper
#wrapper_impl #wrapper_impl
try!(visitor.visit_value::<#wrapper_ty>()).value try!(visitor.visit_value::<#wrapper_ty>()).value
}) }))
} }
}; };
quote! { quote! {
+16 -5
View File
@@ -279,7 +279,9 @@ fn serialize_variant(
); );
quote! { quote! {
#type_ident::#variant_ident(ref __simple_value) => #block, // The braces are unnecessary but quasi used to put them in. We
// can remove them separately from the syn conversion.
#type_ident::#variant_ident(ref __simple_value) => { #block },
} }
}, },
Style::Tuple => { Style::Tuple => {
@@ -447,6 +449,7 @@ fn serialize_tuple_struct_visitor(
let id = aster::id(format!("__field{}", i)); let id = aster::id(format!("__field{}", i));
quote!(#id) quote!(#id)
} else { } else {
let i = aster::id(i);
quote!(&self.#i) quote!(&self.#i)
}; };
@@ -459,11 +462,15 @@ fn serialize_tuple_struct_visitor(
} }
let ser = quote! { let ser = quote! {
try!(_serializer.#func(&mut __serde_state, #field_expr)); // This line should end in a semicolon but quasi used to behave
// differently between skipped and non-skipped so I have
// preserved that behavior. We can update it separately from the
// syn conversion.
try!(_serializer.#func(&mut __serde_state, #field_expr))
}; };
match skip { match skip {
None => ser, None => quote!(#ser;),
Some(skip) => quote!(if !#skip { #ser }), Some(skip) => quote!(if !#skip { #ser }),
} }
}) })
@@ -498,11 +505,15 @@ fn serialize_struct_visitor(
} }
let ser = quote! { let ser = quote! {
try!(_serializer.#func(&mut __serde_state, #key_expr, #field_expr)); // This line should end in a semicolon but quasi used to behave
// differently between skipped and non-skipped so I have
// preserved that behavior. We can update it separately from the
// syn conversion.
try!(_serializer.#func(&mut __serde_state, #key_expr, #field_expr))
}; };
match skip { match skip {
None => ser, None => quote!(#ser;),
Some(skip) => quote!(if !#skip { #ser }), Some(skip) => quote!(if !#skip { #ser }),
} }
}) })
+1 -1
View File
@@ -15,4 +15,4 @@ unstable-testing = ["clippy"]
[dependencies] [dependencies]
clippy = { version = "^0.*", optional = true } clippy = { version = "^0.*", optional = true }
syn = "0.7.1" syn = "0.8"