diff --git a/serde_codegen/Cargo.toml b/serde_codegen/Cargo.toml index 0a4d6897..56eb6bcc 100644 --- a/serde_codegen/Cargo.toml +++ b/serde_codegen/Cargo.toml @@ -22,8 +22,8 @@ with-syn = [] [dependencies] 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" } -syn = { version = "0.7.1", features = ["aster", "visit"] } +syn = { version = "0.8", features = ["aster", "visit"] } syntex = { version = "^0.44.0", optional = true } syntex_syntax = { version = "^0.44.0", optional = true } diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index dd97407f..398f6422 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -36,9 +36,7 @@ pub fn expand_derive_deserialize(item: &syn::MacroInput) -> Result(deserializer: &mut __D) -> ::std::result::Result<#ty, __D::Error> where __D: _serde::de::Deserializer - { - #body - } + #body } }; }) @@ -151,6 +149,8 @@ fn deserialize_visitor(generics: &syn::Generics) -> (Tokens, Tokens, Tokens) { quote!(__Visitor), ) } else { + let where_clause = &generics.where_clause; + let num_phantoms = generics.lifetimes.len() + generics.ty_params.len(); let phantom_types = generics.lifetimes.iter() @@ -190,7 +190,7 @@ fn deserialize_visitor(generics: &syn::Generics) -> (Tokens, Tokens, Tokens) { ( quote! { - struct __Visitor #generics ( #(phantom_types),* ); + struct __Visitor #generics ( #(phantom_types),* ) #where_clause; }, quote!(__Visitor <#(all_params),*> ), quote!(__Visitor #ty_param_idents ( #(phantom_exprs),* )), @@ -204,7 +204,7 @@ fn deserialize_unit_struct( ) -> Tokens { let type_name = item_attrs.name().deserialize_name(); - quote! { + quote!({ struct __Visitor; impl _serde::de::Visitor for __Visitor { @@ -227,7 +227,7 @@ fn deserialize_unit_struct( } deserializer.deserialize_unit_struct(#type_name, __Visitor) - } + }) } fn deserialize_tuple( @@ -537,7 +537,7 @@ fn deserialize_item_enum( let (visitor_item, visitor_ty, visitor_expr) = deserialize_visitor(impl_generics); - quote! { + quote!({ #variant_visitor #visitor_item @@ -557,7 +557,7 @@ fn deserialize_item_enum( #variants_stmt deserializer.deserialize_enum(#type_name, VARIANTS, #visitor_expr) - } + }) } fn deserialize_variant( @@ -628,9 +628,11 @@ fn deserialize_newtype_variant( }) } }; - quote! { - Ok(#type_ident::#variant_ident(#visit)), - } + // The outer braces are unnecessary but quasi used to have them. We can + // remove them separately from the syn conversion. + quote!({ + Ok(#type_ident::#variant_ident(#visit)) + }) } fn deserialize_field_visitor( @@ -861,11 +863,14 @@ fn deserialize_map( Some(path) => { let (wrapper, wrapper_impl, wrapper_ty) = wrap_deserialize_with( 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_impl try!(visitor.visit_value::<#wrapper_ty>()).value - }) + })) } }; quote! { diff --git a/serde_codegen/src/ser.rs b/serde_codegen/src/ser.rs index bb1c1089..57d85fb7 100644 --- a/serde_codegen/src/ser.rs +++ b/serde_codegen/src/ser.rs @@ -279,7 +279,9 @@ fn serialize_variant( ); 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 => { @@ -447,6 +449,7 @@ fn serialize_tuple_struct_visitor( let id = aster::id(format!("__field{}", i)); quote!(#id) } else { + let i = aster::id(i); quote!(&self.#i) }; @@ -459,11 +462,15 @@ fn serialize_tuple_struct_visitor( } 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 { - None => ser, + None => quote!(#ser;), Some(skip) => quote!(if !#skip { #ser }), } }) @@ -498,11 +505,15 @@ fn serialize_struct_visitor( } 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 { - None => ser, + None => quote!(#ser;), Some(skip) => quote!(if !#skip { #ser }), } }) diff --git a/serde_codegen_internals/Cargo.toml b/serde_codegen_internals/Cargo.toml index 30534fde..8d14d7bf 100644 --- a/serde_codegen_internals/Cargo.toml +++ b/serde_codegen_internals/Cargo.toml @@ -15,4 +15,4 @@ unstable-testing = ["clippy"] [dependencies] clippy = { version = "^0.*", optional = true } -syn = "0.7.1" +syn = "0.8"