Blame servo/components/dom_struct/lib.rs

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#![feature(proc_macro)]
Packit f0b94e
Packit f0b94e
extern crate proc_macro;
Packit f0b94e
Packit f0b94e
use proc_macro::{TokenStream, quote};
Packit f0b94e
use std::iter;
Packit f0b94e
Packit f0b94e
#[proc_macro_attribute]
Packit f0b94e
pub fn dom_struct(args: TokenStream, input: TokenStream) -> TokenStream {
Packit f0b94e
    if !args.is_empty() {
Packit f0b94e
        panic!("#[dom_struct] takes no arguments");
Packit f0b94e
    }
Packit f0b94e
    let attributes = quote! {
Packit f0b94e
        #[derive(DenyPublicFields, DomObject, JSTraceable, MallocSizeOf)]
Packit f0b94e
        #[must_root]
Packit f0b94e
        #[repr(C)]
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    // Work around https://github.com/rust-lang/rust/issues/46489
Packit f0b94e
    let attributes = attributes.to_string().parse().unwrap();
Packit f0b94e
Packit f0b94e
    iter::once(attributes).chain(iter::once(input)).collect()
Packit f0b94e
}