1 //! Macro ABI for version 1.63 of rustc
11 use libloading
::Library
;
12 use proc_macro_api
::ProcMacroKind
;
15 use super::PanicMessage
;
17 pub use ra_server
::TokenStream
;
19 pub(crate) struct Abi
{
20 exported_macros
: Vec
<proc_macro
::bridge
::client
::ProcMacro
>,
23 impl From
<proc_macro
::bridge
::PanicMessage
> for PanicMessage
{
24 fn from(p
: proc_macro
::bridge
::PanicMessage
) -> Self {
25 Self { message: p.as_str().map(|s| s.to_string()) }
30 pub unsafe fn from_lib(lib
: &Library
, symbol_name
: String
) -> Result
<Abi
, libloading
::Error
> {
31 let macros
: libloading
::Symbol
<'_
, &&[proc_macro
::bridge
::client
::ProcMacro
]> =
32 lib
.get(symbol_name
.as_bytes())?
;
33 Ok(Self { exported_macros: macros.to_vec() }
)
39 macro_body
: &tt
::Subtree
,
40 attributes
: Option
<&tt
::Subtree
>,
41 ) -> Result
<tt
::Subtree
, PanicMessage
> {
42 let parsed_body
= TokenStream
::with_subtree(macro_body
.clone());
44 let parsed_attributes
=
45 attributes
.map_or(TokenStream
::new(), |attr
| 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 ra_server
::RustAnalyzer
::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 ra_server
::RustAnalyzer
::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 ra_server
::RustAnalyzer
::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
)