diff --git a/crates/proc-macro-srv/src/lib.rs b/crates/proc-macro-srv/src/lib.rs index 85833dab1b..c8d9e6cc29 100644 --- a/crates/proc-macro-srv/src/lib.rs +++ b/crates/proc-macro-srv/src/lib.rs @@ -175,7 +175,7 @@ fn expand_id( }); let res = match thread { Ok(handle) => handle.join(), - Err(e) => std::panic::resume_unwind(Box::new(e)), + Err(e) => return Err(e.to_string()), }; match res { @@ -223,7 +223,7 @@ fn expand_ra_span( }); let res = match thread { Ok(handle) => handle.join(), - Err(e) => std::panic::resume_unwind(Box::new(e)), + Err(e) => return Err(e.to_string()), }; match res { diff --git a/crates/ra-salsa/src/lib.rs b/crates/ra-salsa/src/lib.rs index 8530521d91..6e43676354 100644 --- a/crates/ra-salsa/src/lib.rs +++ b/crates/ra-salsa/src/lib.rs @@ -610,11 +610,9 @@ where #[non_exhaustive] pub enum Cancelled { /// The query was operating on revision R, but there is a pending write to move to revision R+1. - #[non_exhaustive] PendingWrite, /// The query was blocked on another thread, and that thread panicked. - #[non_exhaustive] PropagatedPanic, } diff --git a/crates/rust-analyzer/src/handlers/dispatch.rs b/crates/rust-analyzer/src/handlers/dispatch.rs index 2aa4ffbe1d..148a8194cd 100644 --- a/crates/rust-analyzer/src/handlers/dispatch.rs +++ b/crates/rust-analyzer/src/handlers/dispatch.rs @@ -5,6 +5,7 @@ use std::{ }; use ide::Cancelled; +use ide_db::base_db::ra_salsa::Cycle; use lsp_server::{ExtractError, Response, ResponseError}; use serde::{de::DeserializeOwned, Serialize}; use stdx::thread::ThreadIntent; @@ -328,7 +329,13 @@ where if let Some(panic_message) = panic_message { message.push_str(": "); message.push_str(panic_message) - }; + } else if let Some(cycle) = panic.downcast_ref::() { + tracing::error!("Cycle propagated out of salsa! This is a bug: {cycle:?}"); + return Err(Cancelled::PropagatedPanic); + } else if let Ok(cancelled) = panic.downcast::() { + tracing::error!("Cancellation propagated out of salsa! This is a bug"); + return Err(*cancelled); + } Ok(lsp_server::Response::new_err( id, diff --git a/crates/rust-analyzer/tests/slow-tests/main.rs b/crates/rust-analyzer/tests/slow-tests/main.rs index c1ca596063..ccd2ecdb13 100644 --- a/crates/rust-analyzer/tests/slow-tests/main.rs +++ b/crates/rust-analyzer/tests/slow-tests/main.rs @@ -1085,7 +1085,7 @@ fn resolve_proc_macro() { let sysroot = project_model::Sysroot::discover( &AbsPathBuf::assert_utf8(std::env::current_dir().unwrap()), &Default::default(), - project_model::SysrootQueryMetadata::CargoMetadata, + &project_model::SysrootQueryMetadata::default(), ); let proc_macro_server_path = sysroot.discover_proc_macro_srv().unwrap();