Make #[dom_struct] a proc_macro attribute

This commit is contained in:
Anthony Ramine 2017-02-21 11:27:05 +01:00
parent 64885c4213
commit 31e9d81c0f
251 changed files with 298 additions and 35 deletions

View file

@ -1,24 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
use syntax::ast::MetaItem;
use syntax::codemap::Span;
use syntax::ext::base::{Annotatable, ExtCtxt};
use syntax::ptr::P;
pub fn expand_dom_struct(cx: &mut ExtCtxt, sp: Span, _: &MetaItem, anno: Annotatable) -> Annotatable {
if let Annotatable::Item(item) = anno {
let mut item2 = (*item).clone();
item2.attrs.push(quote_attr!(cx, #[must_root]));
item2.attrs.push(quote_attr!(cx, #[repr(C)]));
item2.attrs.push(quote_attr!(cx, #[derive(JSTraceable)]));
item2.attrs.push(quote_attr!(cx, #[derive(HeapSizeOf)]));
item2.attrs.push(quote_attr!(cx, #[derive(DenyPublicFields)]));
item2.attrs.push(quote_attr!(cx, #[derive(DomObject)]));
Annotatable::Item(P(item2))
} else {
cx.span_err(sp, "#[dom_struct] applied to something other than a struct");
anno
}
}

View file

@ -15,7 +15,7 @@
#![deny(unsafe_code)]
#![feature(box_syntax, plugin, plugin_registrar, quote, rustc_private, slice_patterns)]
#![feature(box_syntax, plugin, plugin_registrar, rustc_private, slice_patterns)]
#[macro_use]
extern crate rustc;
@ -23,24 +23,15 @@ extern crate rustc_plugin;
extern crate syntax;
use rustc_plugin::Registry;
use syntax::ext::base::*;
use syntax::feature_gate::AttributeType::Whitelisted;
use syntax::symbol::Symbol;
mod ban;
// Public for documentation to show up
/// Handles the auto-deriving for `#[derive(JSTraceable)]`
pub mod jstraceable;
mod unrooted_must_root;
/// Utilities for writing plugins
mod utils;
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_syntax_extension(
Symbol::intern("dom_struct"),
MultiModifier(box jstraceable::expand_dom_struct));
reg.register_late_lint_pass(box unrooted_must_root::UnrootedPass::new());
reg.register_early_lint_pass(box ban::BanPass);
reg.register_attribute("allow_unrooted_interior".to_string(), Whitelisted);