lsp: Handle dynamic registration of workspace diagnostic capabilities (#40095)

Workspace diagnostics in Zed have a dedicated background task that
handles querying the language server based on workspace diagnostics
refresh requests issued by both Zed and language server itself.
We only spawned that task when language server declared support for
workspace diagnostics on boot-up. This made workspace diagnostics
unavailable
when a language server (say, Ty) declared support via a capability
registration.
Originally reported in
https://github.com/zed-industries/zed/issues/39144#issuecomment-3370320004

Release Notes:

- python: Fixed workspace diagnostics not working with Ty.
This commit is contained in:
Piotr Osiewicz
2025-10-13 12:30:26 +00:00
committed by GitHub
parent af52cbacf9
commit ff50f48980
+29
View File
@@ -11444,9 +11444,25 @@ impl LspStore {
.map(serde_json::from_value)
.transpose()?
{
let state = self
.as_local_mut()
.context("Expected LSP Store to be local")?
.language_servers
.get_mut(&server_id)
.context("Could not obtain Language Servers state")?;
server.update_capabilities(|capabilities| {
capabilities.diagnostic_provider = Some(caps);
});
if let LanguageServerState::Running {
workspace_refresh_task,
..
} = state
&& workspace_refresh_task.is_none()
{
*workspace_refresh_task =
lsp_workspace_diagnostics_refresh(server.clone(), cx)
}
notify_server_capabilities_updated(&server, cx);
}
}
@@ -11610,6 +11626,19 @@ impl LspStore {
server.update_capabilities(|capabilities| {
capabilities.diagnostic_provider = None;
});
let state = self
.as_local_mut()
.context("Expected LSP Store to be local")?
.language_servers
.get_mut(&server_id)
.context("Could not obtain Language Servers state")?;
if let LanguageServerState::Running {
workspace_refresh_task,
..
} = state
{
_ = workspace_refresh_task.take();
}
notify_server_capabilities_updated(&server, cx);
}
"textDocument/documentColor" => {