1 use crate::proc_macro_server;
3 use errors::FatalError;
4 use syntax::source_map::Span;
5 use syntax::ext::base::{self, *};
6 use syntax::tokenstream::TokenStream;
8 pub const EXEC_STRATEGY: proc_macro::bridge::server::SameThread =
9 proc_macro::bridge::server::SameThread;
11 pub struct AttrProcMacro {
12 pub client: proc_macro::bridge::client::Client<
13 fn(proc_macro::TokenStream, proc_macro::TokenStream) -> proc_macro::TokenStream,
17 impl base::AttrProcMacro for AttrProcMacro {
19 ecx: &'cx mut ExtCtxt<'_>,
21 annotation: TokenStream,
22 annotated: TokenStream)
24 let server = proc_macro_server::Rustc::new(ecx);
25 match self.client.run(&EXEC_STRATEGY, server, annotation, annotated) {
28 let msg = "custom attribute panicked";
29 let mut err = ecx.struct_span_fatal(span, msg);
30 if let Some(s) = e.as_str() {
31 err.help(&format!("message: {}", s));
41 pub struct BangProcMacro {
42 pub client: proc_macro::bridge::client::Client<
43 fn(proc_macro::TokenStream) -> proc_macro::TokenStream,
47 impl base::ProcMacro for BangProcMacro {
49 ecx: &'cx mut ExtCtxt<'_>,
53 let server = proc_macro_server::Rustc::new(ecx);
54 match self.client.run(&EXEC_STRATEGY, server, input) {
57 let msg = "proc macro panicked";
58 let mut err = ecx.struct_span_fatal(span, msg);
59 if let Some(s) = e.as_str() {
60 err.help(&format!("message: {}", s));