3 #![feature(plugin_registrar)]
4 #![feature(box_syntax, rustc_private)]
7 extern crate syntax_pos;
9 extern crate rustc_driver;
11 use std::borrow::ToOwned;
13 use syntax::ext::base::{SyntaxExtension, SyntaxExtensionKind};
14 use syntax::ext::base::{TTMacroExpander, ExtCtxt, MacResult, MacEager};
15 use syntax::print::pprust;
16 use syntax::symbol::Symbol;
18 use syntax::tokenstream::TokenStream;
19 use rustc_driver::plugin::Registry;
22 args: Vec<ast::NestedMetaItem>,
25 impl TTMacroExpander for Expander {
27 ecx: &'cx mut ExtCtxt,
29 _: TokenStream) -> Box<dyn MacResult+'cx> {
30 let args = self.args.iter().map(|i| pprust::meta_list_item_to_string(i))
31 .collect::<Vec<_>>().join(", ");
32 MacEager::expr(ecx.expr_str(sp, Symbol::intern(&args)))
37 pub fn plugin_registrar(reg: &mut Registry) {
38 let args = reg.args().to_owned();
39 reg.register_syntax_extension(Symbol::intern("plugin_args"), SyntaxExtension::default(
40 SyntaxExtensionKind::LegacyBang(Box::new(Expander { args })), reg.sess.edition()