Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/proc_macros.rs')
-rw-r--r--crates/proc-macro-srv/src/proc_macros.rs37
1 files changed, 18 insertions, 19 deletions
diff --git a/crates/proc-macro-srv/src/proc_macros.rs b/crates/proc-macro-srv/src/proc_macros.rs
index 097b39a3f9..58f5e80dc4 100644
--- a/crates/proc-macro-srv/src/proc_macros.rs
+++ b/crates/proc-macro-srv/src/proc_macros.rs
@@ -1,15 +1,15 @@
//! Proc macro ABI
use proc_macro::bridge;
-use proc_macro_api::ProcMacroKind;
use libloading::Library;
-use crate::{dylib::LoadProcMacroDylibError, ProcMacroSrvSpan};
+use crate::{
+ dylib::LoadProcMacroDylibError, server_impl::TopSubtree, ProcMacroKind, ProcMacroSrvSpan,
+};
-pub(crate) struct ProcMacros {
- exported_macros: Vec<bridge::client::ProcMacro>,
-}
+#[repr(transparent)]
+pub(crate) struct ProcMacros([bridge::client::ProcMacro]);
impl From<bridge::PanicMessage> for crate::PanicMessage {
fn from(p: bridge::PanicMessage) -> Self {
@@ -27,29 +27,28 @@ impl ProcMacros {
/// *`info` - RustCInfo about the compiler that was used to compile the
/// macro crate. This is the information we use to figure out
/// which ABI to return
- pub(crate) fn from_lib(
- lib: &Library,
+ pub(crate) fn from_lib<'l>(
+ lib: &'l Library,
symbol_name: String,
version_string: &str,
- ) -> Result<ProcMacros, LoadProcMacroDylibError> {
- if version_string == crate::RUSTC_VERSION_STRING {
- let macros =
- unsafe { lib.get::<&&[bridge::client::ProcMacro]>(symbol_name.as_bytes()) }?;
-
- return Ok(Self { exported_macros: macros.to_vec() });
+ ) -> Result<&'l ProcMacros, LoadProcMacroDylibError> {
+ if version_string != crate::RUSTC_VERSION_STRING {
+ return Err(LoadProcMacroDylibError::AbiMismatch(version_string.to_owned()));
}
- Err(LoadProcMacroDylibError::AbiMismatch(version_string.to_owned()))
+ unsafe { lib.get::<&'l &'l ProcMacros>(symbol_name.as_bytes()) }
+ .map(|it| **it)
+ .map_err(Into::into)
}
pub(crate) fn expand<S: ProcMacroSrvSpan>(
&self,
macro_name: &str,
- macro_body: tt::Subtree<S>,
- attributes: Option<tt::Subtree<S>>,
+ macro_body: TopSubtree<S>,
+ attributes: Option<TopSubtree<S>>,
def_site: S,
call_site: S,
mixed_site: S,
- ) -> Result<tt::Subtree<S>, crate::PanicMessage> {
+ ) -> Result<TopSubtree<S>, crate::PanicMessage> {
let parsed_body = crate::server_impl::TokenStream::with_subtree(macro_body);
let parsed_attributes = attributes
@@ -57,7 +56,7 @@ impl ProcMacros {
crate::server_impl::TokenStream::with_subtree(attr)
});
- for proc_macro in &self.exported_macros {
+ for proc_macro in &self.0 {
match proc_macro {
bridge::client::ProcMacro::CustomDerive { trait_name, client, .. }
if *trait_name == macro_name =>
@@ -103,7 +102,7 @@ impl ProcMacros {
}
pub(crate) fn list_macros(&self) -> Vec<(String, ProcMacroKind)> {
- self.exported_macros
+ self.0
.iter()
.map(|proc_macro| match proc_macro {
bridge::client::ProcMacro::CustomDerive { trait_name, .. } => {