diff --git a/Cargo.lock b/Cargo.lock index 4508675ddb6..9a8a9378e4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1304,9 +1304,9 @@ dependencies = [ name = "jstraceable_derive" version = "0.0.1" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/components/jstraceable_derive/Cargo.toml b/components/jstraceable_derive/Cargo.toml index eb01baa08ef..44dbd8ee716 100644 --- a/components/jstraceable_derive/Cargo.toml +++ b/components/jstraceable_derive/Cargo.toml @@ -10,6 +10,6 @@ path = "lib.rs" proc-macro = true [dependencies] -quote = "0.3.15" -syn = "0.11" -synstructure = "0.5" +quote = "0.4.2" +syn = "0.12.12" +synstructure = "0.7" diff --git a/components/jstraceable_derive/lib.rs b/components/jstraceable_derive/lib.rs index 66b172d6a1d..d90ada8d19d 100644 --- a/components/jstraceable_derive/lib.rs +++ b/components/jstraceable_derive/lib.rs @@ -2,39 +2,24 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -extern crate proc_macro; #[macro_use] extern crate quote; -extern crate syn; -extern crate synstructure; +#[macro_use] extern crate syn; +#[macro_use] extern crate synstructure; -#[proc_macro_derive(JSTraceable)] -pub fn expand_token_stream(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - expand_string(&input.to_string()).parse().unwrap() -} +decl_derive!([JSTraceable] => js_traceable_derive); -fn expand_string(input: &str) -> String { - let mut type_ = syn::parse_macro_input(input).unwrap(); - - let style = synstructure::BindStyle::Ref.into(); - let match_body = synstructure::each_field(&mut type_, &style, |binding| { - Some(quote! { #binding.trace(tracer); }) +fn js_traceable_derive(s: synstructure::Structure) -> quote::Tokens { + let match_body = s.each(|binding| { + Some(quote!(#binding.trace(tracer);)) }); - let name = &type_.ident; - let (impl_generics, ty_generics, where_clause) = type_.generics.split_for_impl(); - let mut where_clause = where_clause.clone(); - for param in &type_.generics.ty_params { - where_clause.predicates.push(syn::WherePredicate::BoundPredicate(syn::WhereBoundPredicate { - bound_lifetimes: Vec::new(), - bounded_ty: syn::Ty::Path(None, param.ident.clone().into()), - bounds: vec![syn::TyParamBound::Trait( - syn::PolyTraitRef { - bound_lifetimes: Vec::new(), - trait_ref: syn::parse_path("::dom::bindings::trace::JSTraceable").unwrap(), - }, - syn::TraitBoundModifier::None - )], - })) + let ast = s.ast(); + let name = ast.ident; + let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl(); + let mut where_clause = where_clause.unwrap_or(&parse_quote!(where)).clone(); + for param in ast.generics.type_params() { + let ident = param.ident; + where_clause.predicates.push(parse_quote!(#ident: ::dom::bindings::trace::JSTraceable)) } let tokens = quote! { @@ -51,5 +36,5 @@ fn expand_string(input: &str) -> String { } }; - tokens.to_string() + tokens }