From c45550de7351fe4194e2c3671f597c1d868e25ae Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 15 Oct 2014 14:25:02 +0530 Subject: [PATCH] Add unifying #[dom_struct] attribute (fixes #3667) --- components/plugins/jstraceable.rs | 13 ++++++++++++- components/plugins/lib.rs | 5 +++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/components/plugins/jstraceable.rs b/components/plugins/jstraceable.rs index 19171a6ded1..b0a0c98330b 100644 --- a/components/plugins/jstraceable.rs +++ b/components/plugins/jstraceable.rs @@ -7,10 +7,21 @@ use syntax::codemap::Span; use syntax::ptr::P; use syntax::ast::{Item, MetaItem, Expr}; use syntax::ast; +use syntax::attr; use syntax::ext::build::AstBuilder; use syntax::ext::deriving::generic::{combine_substructure, EnumMatching, FieldInfo, MethodDef, Struct, Substructure, TraitDef, ty}; +use syntax::parse::token::InternedString; - pub fn expand_jstraceable(cx: &mut ExtCtxt, span: Span, mitem: &MetaItem, item: &Item, push: |P|) { +pub fn expand_dom_struct(_: &mut ExtCtxt, _: Span, _: &MetaItem, item: P) -> P { + let mut item2 = (*item).clone(); + item2.attrs.push(attr::mk_attr_outer(attr::mk_attr_id(), attr::mk_word_item(InternedString::new("must_root")))); + item2.attrs.push(attr::mk_attr_outer(attr::mk_attr_id(), attr::mk_word_item(InternedString::new("privatize")))); + item2.attrs.push(attr::mk_attr_outer(attr::mk_attr_id(), attr::mk_word_item(InternedString::new("jstraceable")))); + //expand_jstraceable_inner(cx, span, mitem, &*item, |_| ()); + P(item2) +} + +pub fn expand_jstraceable(cx: &mut ExtCtxt, span: Span, mitem: &MetaItem, item: &Item, push: |P|) { let trait_def = TraitDef { span: span, attributes: Vec::new(), diff --git a/components/plugins/lib.rs b/components/plugins/lib.rs index d4894963f8f..2d00c8d3f3b 100644 --- a/components/plugins/lib.rs +++ b/components/plugins/lib.rs @@ -15,7 +15,7 @@ extern crate sync; use rustc::lint::LintPassObject; use rustc::plugin::Registry; -use syntax::ext::base::Decorator; +use syntax::ext::base::{Decorator, Modifier}; use syntax::parse::token::intern; @@ -25,9 +25,10 @@ mod jstraceable; #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { + reg.register_syntax_extension(intern("dom_struct"), Modifier(box jstraceable::expand_dom_struct)); + reg.register_syntax_extension(intern("jstraceable"), Decorator(box jstraceable::expand_jstraceable)); reg.register_lint_pass(box lints::TransmutePass as LintPassObject); reg.register_lint_pass(box lints::UnrootedPass as LintPassObject); reg.register_lint_pass(box lints::PrivatizePass as LintPassObject); - reg.register_syntax_extension(intern("jstraceable"), Decorator(box jstraceable::expand_jstraceable)) }