Fix unregistration logic for pull diagnostics (#44294)
John Tur
created 3 weeks ago
Even if `workspace_diagnostics_refresh_tasks` is empty, registrations
which didn't advertise support for workspace diagnostics may still
exist.
Release Notes:
- N/A
Change summary
crates/project/src/lsp_store.rs | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
Detailed changes
@@ -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;