From 9e33243015d39ac54060c074d275aca3de77f2d9 Mon Sep 17 00:00:00 2001 From: John Tur Date: Sat, 6 Dec 2025 11:31:05 -0500 Subject: [PATCH] Fix unregistration logic for pull diagnostics (#44294) Even if `workspace_diagnostics_refresh_tasks` is empty, registrations which didn't advertise support for workspace diagnostics may still exist. Release Notes: - N/A --- crates/project/src/lsp_store.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 59b7a6932d4733a78959e9e4f481a63589811a52..1ae6d1295f37df31aac03e2019cb5510c836fb1c 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -12647,30 +12647,29 @@ impl LspStore { .language_servers .get_mut(&server_id) .context("Could not obtain Language Servers state")?; - local + let registrations = local .language_server_dynamic_registrations .get_mut(&server_id) .with_context(|| { format!("Expected dynamic registration to exist for server {server_id}") - })?.diagnostics + })?; + registrations.diagnostics .remove(&Some(unreg.id.clone())) .with_context(|| format!( "Attempted to unregister non-existent diagnostic registration with ID {}", unreg.id) )?; + let removed_last_diagnostic_provider = registrations.diagnostics.is_empty(); - let mut has_any_diagnostic_providers_still = true; if let LanguageServerState::Running { workspace_diagnostics_refresh_tasks, .. } = state { workspace_diagnostics_refresh_tasks.remove(&Some(unreg.id.clone())); - has_any_diagnostic_providers_still = - !workspace_diagnostics_refresh_tasks.is_empty(); } - if !has_any_diagnostic_providers_still { + if removed_last_diagnostic_provider { server.update_capabilities(|capabilities| { debug_assert!(capabilities.diagnostic_provider.is_some()); capabilities.diagnostic_provider = None;