project: Handle capabilities parse for more methods when registerOptions doesn't exist (#36984)

Closes #36938

Follow up to https://github.com/zed-industries/zed/pull/36554

When `registerOptions` is `None`, we should fall back instead of
skipping capability registration.

1. `Option<OneOf<bool, T>>`, where `T` is struct – handled in the
attached PR 
2. `Option<T>`, where `T` is an enum that can be `Simple(bool)` or
`Options(S)` – this PR 
3. `Option<T>`, where `T` is struct – we should fall back to default
values for these options ⚠️

Release Notes:

- Fixed an issue where hover popovers would not appear in language
servers like Java.
This commit is contained in:
Smit Barmase
2025-08-27 13:00:10 +05:30
committed by GitHub
parent a03897012e
commit ea347b0aa1
+27 -31
View File
@@ -11778,17 +11778,15 @@ impl LspStore {
notify_server_capabilities_updated(&server, cx);
}
"textDocument/codeAction" => {
if let Some(options) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.code_action_provider =
Some(lsp::CodeActionProviderCapability::Options(options));
});
notify_server_capabilities_updated(&server, cx);
}
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::CodeActionProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
server.update_capabilities(|capabilities| {
capabilities.code_action_provider = Some(provider);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/definition" => {
let options = parse_register_capabilities(reg)?;
@@ -11810,16 +11808,15 @@ impl LspStore {
}
}
"textDocument/hover" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.hover_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::HoverProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
server.update_capabilities(|capabilities| {
capabilities.hover_provider = Some(provider);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/signatureHelp" => {
if let Some(caps) = reg
@@ -11904,16 +11901,15 @@ impl LspStore {
}
}
"textDocument/documentColor" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.color_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::ColorProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
server.update_capabilities(|capabilities| {
capabilities.color_provider = Some(provider);
});
notify_server_capabilities_updated(&server, cx);
}
_ => log::warn!("unhandled capability registration: {reg:?}"),
}