1 //! Macro ABI for version 1.63 of rustc
11 use libloading::Library;
12 use proc_macro_api::ProcMacroKind;
14 use super::PanicMessage;
16 pub use ra_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 = TokenStream::with_subtree(macro_body.clone());
43 let parsed_attributes =
44 attributes.map_or(TokenStream::new(), |attr| TokenStream::with_subtree(attr.clone()));
46 for proc_macro in &self.exported_macros {
48 proc_macro::bridge::client::ProcMacro::CustomDerive {
49 trait_name, client, ..
50 } if *trait_name == macro_name => {
52 &proc_macro::bridge::server::SameThread,
53 ra_server::RustAnalyzer::default(),
57 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
59 proc_macro::bridge::client::ProcMacro::Bang { name, client }
60 if *name == macro_name =>
63 &proc_macro::bridge::server::SameThread,
64 ra_server::RustAnalyzer::default(),
68 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
70 proc_macro::bridge::client::ProcMacro::Attr { name, client }
71 if *name == macro_name =>
74 &proc_macro::bridge::server::SameThread,
75 ra_server::RustAnalyzer::default(),
80 return res.map(|it| it.into_subtree()).map_err(PanicMessage::from);
86 Err(proc_macro::bridge::PanicMessage::String("Nothing to expand".to_string()).into())
89 pub fn list_macros(&self) -> Vec<(String, ProcMacroKind)> {
92 .map(|proc_macro| match proc_macro {
93 proc_macro::bridge::client::ProcMacro::CustomDerive { trait_name, .. } => {
94 (trait_name.to_string(), ProcMacroKind::CustomDerive)
96 proc_macro::bridge::client::ProcMacro::Bang { name, .. } => {
97 (name.to_string(), ProcMacroKind::FuncLike)
99 proc_macro::bridge::client::ProcMacro::Attr { name, .. } => {
100 (name.to_string(), ProcMacroKind::Attr)