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