From a9c2953001771e6432fb242ac2eeecff44431268 Mon Sep 17 00:00:00 2001 From: Sofus Addington <sofus@addington.dk> Date: Thu, 6 Mar 2025 16:55:19 +0100 Subject: [PATCH] Retry on cancelled request --- helix-term/src/handlers/diagnostics.rs | 30 ++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/helix-term/src/handlers/diagnostics.rs b/helix-term/src/handlers/diagnostics.rs index 39799c5f..4f537afb 100644 --- a/helix-term/src/handlers/diagnostics.rs +++ b/helix-term/src/handlers/diagnostics.rs @@ -177,7 +177,8 @@ pub fn pull_diagnostics_for_document( } }); - let provider = DiagnosticProvider::from_server_and_identifier(language_server.id(), identifier); + let language_server_id = language_server.id(); + let provider = DiagnosticProvider::from_server_and_identifier(language_server_id, identifier); let document_id = doc.id(); tokio::spawn(async move { @@ -193,7 +194,32 @@ pub fn pull_diagnostics_for_document( }) .await } - Err(err) => log::error!("Pull diagnostic request failed: {err}"), + Err(err) => { + let parsed_cancellation_data = if let helix_lsp::Error::Rpc(error) = err { + error.data.and_then(|data| { + serde_json::from_value::<lsp::DiagnosticServerCancellationData>(data).ok() + }) + } else { + log::error!("Pull diagnostic request failed: {err}"); + return; + }; + + if let Some(parsed_cancellation_data) = parsed_cancellation_data { + if parsed_cancellation_data.retrigger_request { + tokio::time::sleep(Duration::from_millis(500)).await; + + job::dispatch(move |editor, _| { + if let (Some(doc), Some(language_server)) = ( + editor.document(document_id), + editor.language_server_by_id(language_server_id), + ) { + pull_diagnostics_for_document(doc, language_server); + } + }) + .await; + } + } + } } }); }