]> git.proxmox.com Git - rustc.git/blob - src/test/ui-fulldeps/auxiliary/plugin-args.rs
New upstream version 1.38.0+dfsg1
[rustc.git] / src / test / ui-fulldeps / auxiliary / plugin-args.rs
1 // force-host
2
3 #![feature(plugin_registrar)]
4 #![feature(box_syntax, rustc_private)]
5
6 extern crate syntax;
7 extern crate syntax_pos;
8 extern crate rustc;
9 extern crate rustc_plugin;
10 extern crate rustc_driver;
11
12 use std::borrow::ToOwned;
13 use syntax::ast;
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;
18 use syntax_pos::Span;
19 use syntax::tokenstream::TokenStream;
20 use rustc_plugin::Registry;
21
22 struct Expander {
23 args: Vec<ast::NestedMetaItem>,
24 }
25
26 impl TTMacroExpander for Expander {
27 fn expand<'cx>(&self,
28 ecx: &'cx mut ExtCtxt,
29 sp: Span,
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)))
34 }
35 }
36
37 #[plugin_registrar]
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()
42 ));
43 }