]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | // force-host |
2 | ||
3 | #![feature(plugin_registrar)] | |
c34b1796 | 4 | #![feature(box_syntax, rustc_private)] |
1a4d82fc JJ |
5 | |
6 | extern crate syntax; | |
e74abb32 | 7 | extern crate syntax_expand; |
3157f602 | 8 | extern crate syntax_pos; |
1a4d82fc | 9 | extern crate rustc; |
416331ca | 10 | extern crate rustc_driver; |
1a4d82fc JJ |
11 | |
12 | use std::borrow::ToOwned; | |
13 | use syntax::ast; | |
e74abb32 XL |
14 | use syntax_expand::base::{SyntaxExtension, SyntaxExtensionKind}; |
15 | use syntax_expand::base::{TTMacroExpander, ExtCtxt, MacResult, MacEager}; | |
1a4d82fc | 16 | use syntax::print::pprust; |
476ff2be | 17 | use syntax::symbol::Symbol; |
3157f602 | 18 | use syntax_pos::Span; |
8bb4bdeb | 19 | use syntax::tokenstream::TokenStream; |
e1599b0c | 20 | use rustc_driver::plugin::Registry; |
1a4d82fc JJ |
21 | |
22 | struct Expander { | |
9e0c209e | 23 | args: Vec<ast::NestedMetaItem>, |
1a4d82fc JJ |
24 | } |
25 | ||
26 | impl TTMacroExpander for Expander { | |
27 | fn expand<'cx>(&self, | |
28 | ecx: &'cx mut ExtCtxt, | |
29 | sp: Span, | |
416331ca | 30 | _: TokenStream) -> Box<dyn MacResult+'cx> { |
9e0c209e | 31 | let args = self.args.iter().map(|i| pprust::meta_list_item_to_string(i)) |
c1a9b12d | 32 | .collect::<Vec<_>>().join(", "); |
476ff2be | 33 | MacEager::expr(ecx.expr_str(sp, Symbol::intern(&args))) |
1a4d82fc JJ |
34 | } |
35 | } | |
36 | ||
37 | #[plugin_registrar] | |
38 | pub fn plugin_registrar(reg: &mut Registry) { | |
a7813a04 | 39 | let args = reg.args().to_owned(); |
dc9dc135 XL |
40 | reg.register_syntax_extension(Symbol::intern("plugin_args"), SyntaxExtension::default( |
41 | SyntaxExtensionKind::LegacyBang(Box::new(Expander { args })), reg.sess.edition() | |
42 | )); | |
1a4d82fc | 43 | } |