Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/lib.rs')
-rw-r--r--crates/proc-macro-srv/src/lib.rs26
1 files changed, 21 insertions, 5 deletions
diff --git a/crates/proc-macro-srv/src/lib.rs b/crates/proc-macro-srv/src/lib.rs
index 99dfa24ca4..0462aafd00 100644
--- a/crates/proc-macro-srv/src/lib.rs
+++ b/crates/proc-macro-srv/src/lib.rs
@@ -123,6 +123,20 @@ pub trait ProcMacroClientInterface {
const EXPANDER_STACK_SIZE: usize = 8 * 1024 * 1024;
+pub enum ExpandError {
+ Panic(PanicMessage),
+ Cancelled { reason: Option<String> },
+}
+
+impl ExpandError {
+ pub fn into_string(self) -> Option<String> {
+ match self {
+ ExpandError::Panic(panic_message) => panic_message.into_string(),
+ ExpandError::Cancelled { reason } => reason,
+ }
+ }
+}
+
impl ProcMacroSrv<'_> {
pub fn expand<S: ProcMacroSrvSpan>(
&self,
@@ -136,10 +150,12 @@ impl ProcMacroSrv<'_> {
call_site: S,
mixed_site: S,
callback: Option<ProcMacroClientHandle<'_>>,
- ) -> Result<token_stream::TokenStream<S>, PanicMessage> {
+ ) -> Result<token_stream::TokenStream<S>, ExpandError> {
let snapped_env = self.env;
- let expander = self.expander(lib.as_ref()).map_err(|err| PanicMessage {
- message: Some(format!("failed to load macro: {err}")),
+ let expander = self.expander(lib.as_ref()).map_err(|err| {
+ ExpandError::Panic(PanicMessage {
+ message: Some(format!("failed to load macro: {err}")),
+ })
})?;
let prev_env = EnvChange::apply(snapped_env, env, current_dir.as_ref().map(<_>::as_ref));
@@ -157,11 +173,11 @@ impl ProcMacroSrv<'_> {
)
});
match thread.unwrap().join() {
- Ok(res) => res,
+ Ok(res) => res.map_err(ExpandError::Panic),
Err(payload) => {
if let Some(cancel) = payload.downcast_ref::<ProcMacroCancelMarker>() {
- return Err(PanicMessage { message: Some(cancel.reason.clone()) });
+ return Err(ExpandError::Cancelled { reason: Some(cancel.reason.clone()) });
}
std::panic::resume_unwind(payload)
}