1 //! Macro ABI for version 1.47 of rustc
10 use libloading::Library;
12 use proc_macro_api::ProcMacroKind;
14 use super::PanicMessage;
16 pub use rustc_server::TokenStream;
18 pub(crate) struct Abi {
19 exported_macros: Vec<proc_macro::bridge::client::ProcMacro>,
22 impl From<proc_macro::bridge::PanicMessage> for PanicMessage {
23 fn from(p: proc_macro::bridge::PanicMessage) -> Self {
24 Self { message: p.as_str().map(|s| s.to_string()) }
29 pub unsafe fn from_lib(lib: &Library, symbol_name: String) -> Result<Abi, libloading::Error> {
30 let macros: libloading::Symbol<&&[proc_macro::bridge::client::ProcMacro]> =
31 lib.get(symbol_name.as_bytes())?;
32 Ok(Self { exported_macros: macros.to_vec() })
38 macro_body: &tt::Subtree,
39 attributes: Option<&tt::Subtree>,
40 ) -> Result<tt::Subtree, PanicMessage> {
41 let parsed_body = rustc_server::TokenStream::with_subtree(macro_body.clone());
43 let parsed_attributes = attributes.map_or(rustc_server::TokenStream::new(), |attr| {
44 rustc_server::TokenStream::with_subtree(attr.clone())
47 for proc_macro in &self.exported_macros {
49 proc_macro::bridge::client::ProcMacro::CustomDerive {
50 trait_name, client, ..
51 } if *trait_name == macro_name => {
53 &proc_macro::bridge::server::SameThread,
54 rustc_server::Rustc::default(),
58 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
60 proc_macro::bridge::client::ProcMacro::Bang { name, client }
61 if *name == macro_name =>
64 &proc_macro::bridge::server::SameThread,
65 rustc_server::Rustc::default(),
69 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
71 proc_macro::bridge::client::ProcMacro::Attr { name, client }
72 if *name == macro_name =>
75 &proc_macro::bridge::server::SameThread,
76 rustc_server::Rustc::default(),
81 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
87 Err(proc_macro::bridge::PanicMessage::String("Nothing to expand".to_string()).into())
90 pub fn list_macros(&self) -> Vec<(String, ProcMacroKind)> {
93 .map(|proc_macro| match proc_macro {
94 proc_macro::bridge::client::ProcMacro::CustomDerive { trait_name, .. } => {
95 (trait_name.to_string(), ProcMacroKind::CustomDerive)
97 proc_macro::bridge::client::ProcMacro::Bang { name, .. } => {
98 (name.to_string(), ProcMacroKind::FuncLike)
100 proc_macro::bridge::client::ProcMacro::Attr { name, .. } => {
101 (name.to_string(), ProcMacroKind::Attr)