Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/rust-analyzer/src/main_loop.rs35
1 files changed, 23 insertions, 12 deletions
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index ec71b4a7a1..4daf295a69 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -4,6 +4,7 @@
use std::{
fmt,
ops::Div as _,
+ panic::AssertUnwindSafe,
time::{Duration, Instant},
};
@@ -552,23 +553,33 @@ impl GlobalState {
let fetch_semantic =
self.vfs_done && self.fetch_workspaces_queue.last_op_result().is_some();
move |sender| {
- let diags = fetch_native_diagnostics(
- &snapshot,
- subscriptions.clone(),
- slice.clone(),
- NativeDiagnosticsFetchKind::Syntax,
- );
+ // We aren't observing the semantics token cache here
+ let snapshot = AssertUnwindSafe(&snapshot);
+ let Ok(diags) = std::panic::catch_unwind(|| {
+ fetch_native_diagnostics(
+ &snapshot,
+ subscriptions.clone(),
+ slice.clone(),
+ NativeDiagnosticsFetchKind::Syntax,
+ )
+ }) else {
+ return;
+ };
sender
.send(Task::Diagnostics(DiagnosticsTaskKind::Syntax(generation, diags)))
.unwrap();
if fetch_semantic {
- let diags = fetch_native_diagnostics(
- &snapshot,
- subscriptions,
- slice,
- NativeDiagnosticsFetchKind::Semantic,
- );
+ let Ok(diags) = std::panic::catch_unwind(|| {
+ fetch_native_diagnostics(
+ &snapshot,
+ subscriptions.clone(),
+ slice.clone(),
+ NativeDiagnosticsFetchKind::Semantic,
+ )
+ }) else {
+ return;
+ };
sender
.send(Task::Diagnostics(DiagnosticsTaskKind::Semantic(
generation, diags,