]> git.lizzy.rs Git - rust.git/blob - src/test/ui-fulldeps/auxiliary/plugin-args.rs
Deprecate using rustc_plugin without the rustc_driver dylib.
[rust.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_driver;
10
11 use std::borrow::ToOwned;
12 use syntax::ast;
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;
17 use syntax_pos::Span;
18 use syntax::tokenstream::TokenStream;
19 use rustc_driver::plugin::Registry;
20
21 struct Expander {
22     args: Vec<ast::NestedMetaItem>,
23 }
24
25 impl TTMacroExpander for Expander {
26     fn expand<'cx>(&self,
27                    ecx: &'cx mut ExtCtxt,
28                    sp: Span,
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)))
33     }
34 }
35
36 #[plugin_registrar]
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()
41     ));
42 }