From a9b6cbb8b37f64ae0f42a0013123ff49a174504e Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 16 Oct 2016 23:17:17 -0700 Subject: [PATCH 1/2] Use post-expansion crate to let other custom derives see serde attrs --- serde_codegen/Cargo.toml | 1 + serde_codegen/src/lib.rs | 55 +++------------------------------------- serde_derive/Cargo.toml | 3 +++ serde_derive/src/lib.rs | 5 ++++ 4 files changed, 13 insertions(+), 51 deletions(-) diff --git a/serde_codegen/Cargo.toml b/serde_codegen/Cargo.toml index 9df0192c..85718720 100644 --- a/serde_codegen/Cargo.toml +++ b/serde_codegen/Cargo.toml @@ -22,6 +22,7 @@ with-syn = [] [dependencies] clippy = { version = "^0.*", optional = true } +post-expansion = "0.0.2" quote = "0.3" serde_codegen_internals = { version = "=0.10.0", default-features = false, path = "../serde_codegen_internals" } syn = { version = "0.9", features = ["aster", "visit"] } diff --git a/serde_codegen/src/lib.rs b/serde_codegen/src/lib.rs index 42e3a0c7..2b2bca94 100644 --- a/serde_codegen/src/lib.rs +++ b/serde_codegen/src/lib.rs @@ -27,6 +27,9 @@ extern crate syn; #[macro_use] extern crate quote; +#[cfg(feature = "with-syn")] +extern crate post_expansion; + #[cfg(feature = "with-syntex")] use std::path::Path; @@ -193,7 +196,7 @@ pub fn expand_single_item(item: &str) -> Result { } else { None:: }; - let syn_item = strip_serde_attrs(syn_item); + let syn_item = post_expansion::strip_attrs_later(syn_item, &["serde"], "serde"); return Ok(quote!(#expanded_ser #expanded_de #syn_item).to_string()); fn strip_serde_derives(item: syn::MacroInput) -> (bool, bool, syn::MacroInput) { @@ -242,54 +245,4 @@ pub fn expand_single_item(item: &str) -> Result { }; (ser, de, item) } - - fn strip_serde_attrs(item: syn::MacroInput) -> syn::MacroInput { - syn::MacroInput { - attrs: strip_serde_from_attrs(item.attrs), - body: match item.body { - syn::Body::Enum(variants) => syn::Body::Enum( - variants.into_iter().map(|variant| { - syn::Variant { - ident: variant.ident, - attrs: strip_serde_from_attrs(variant.attrs), - data: strip_serde_from_variant_data(variant.data), - discriminant: variant.discriminant, - } - }).collect() - ), - syn::Body::Struct(variant_data) => syn::Body::Struct( - strip_serde_from_variant_data(variant_data) - ), - }, - ..item - } - } - - fn strip_serde_from_variant_data(data: syn::VariantData) -> syn::VariantData { - match data { - syn::VariantData::Struct(fields) => syn::VariantData::Struct( - fields.into_iter().map(strip_serde_from_field).collect() - ), - syn::VariantData::Tuple(fields) => syn::VariantData::Tuple( - fields.into_iter().map(strip_serde_from_field).collect() - ), - syn::VariantData::Unit => syn::VariantData::Unit, - } - } - - fn strip_serde_from_field(field: syn::Field) -> syn::Field { - syn::Field { - attrs: strip_serde_from_attrs(field.attrs), - ..field - } - } - - fn strip_serde_from_attrs(attrs: Vec) -> Vec { - attrs.into_iter().filter(|attr| { - match attr.value { - syn::MetaItem::List(ref ident, _) => ident != "serde", - _ => true, - } - }).collect() - } } diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 187755b6..29f9b4d5 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -14,6 +14,9 @@ include = ["Cargo.toml", "src/**/*.rs"] name = "serde_derive" proc-macro = true +[dependencies] +post-expansion = "0.0.2" + [dependencies.serde_codegen] version = "=0.8.13" path = "../serde_codegen" diff --git a/serde_derive/src/lib.rs b/serde_derive/src/lib.rs index 8dd4e6ff..f631d6dd 100644 --- a/serde_derive/src/lib.rs +++ b/serde_derive/src/lib.rs @@ -4,6 +4,9 @@ extern crate proc_macro; extern crate serde_codegen; +#[macro_use] +extern crate post_expansion; + use proc_macro::TokenStream; #[proc_macro_derive(Serialize)] @@ -23,3 +26,5 @@ pub fn derive_deserialize(input: TokenStream) -> TokenStream { Err(msg) => panic!(msg), } } + +register_post_expansion!(PostExpansion_serde); From 49aca521f1caae1e8ade4c7d2a2ab7f9aa7df78a Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 20 Oct 2016 00:01:14 -0700 Subject: [PATCH 2/2] Bump post-expansion dependency --- serde_codegen/Cargo.toml | 2 +- serde_derive/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/serde_codegen/Cargo.toml b/serde_codegen/Cargo.toml index 4b2b12fe..4c78104b 100644 --- a/serde_codegen/Cargo.toml +++ b/serde_codegen/Cargo.toml @@ -22,7 +22,7 @@ with-syn = [] [dependencies] clippy = { version = "^0.*", optional = true } -post-expansion = "0.0.2" +post-expansion = "0.1.0" quote = "0.3" serde_codegen_internals = { version = "=0.10.0", default-features = false, path = "../serde_codegen_internals" } syn = { version = "0.9", features = ["aster", "visit"] } diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 5d1e4176..2f70bef4 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -15,7 +15,7 @@ name = "serde_derive" proc-macro = true [dependencies] -post-expansion = "0.0.2" +post-expansion = "0.1.0" [dependencies.serde_codegen] version = "=0.8.14"