fix: Catch panics from diagnostics computation

This commit is contained in:
Lukas Wirth 2024-09-06 08:21:08 +02:00
parent 4e2e1bf6ed
commit 7e5a0e5777

View File

@ -4,6 +4,7 @@
use std::{
fmt,
ops::Div as _,
panic::AssertUnwindSafe,
time::{Duration, Instant},
};
@ -552,23 +553,33 @@ fn update_diagnostics(&mut self) {
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,