Compare commits

...

2 Commits

Author SHA1 Message Date
Smit Barmase
26149bfc33 fix parse 2025-08-27 18:18:57 +05:30
Smit Barmase
97bcb15e9f use defaults as fallback for register opts 2025-08-27 17:44:52 +05:30

View File

@@ -11703,132 +11703,108 @@ impl LspStore {
// Ignore payload since we notify clients of setting changes unconditionally, relying on them pulling the latest settings.
}
"workspace/symbol" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.workspace_symbol_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"workspace/fileOperations" => {
if let Some(options) = reg.register_options {
let caps = serde_json::from_value(options)?;
server.update_capabilities(|capabilities| {
capabilities
.workspace
.get_or_insert_default()
.file_operations = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let caps = parse_register_or_default(&reg)?;
server.update_capabilities(|capabilities| {
capabilities
.workspace
.get_or_insert_default()
.file_operations = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
"workspace/executeCommand" => {
if let Some(options) = reg.register_options {
let options = serde_json::from_value(options)?;
server.update_capabilities(|capabilities| {
capabilities.execute_command_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
let options = parse_register_or_default(&reg)?;
server.update_capabilities(|capabilities| {
capabilities.execute_command_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/rangeFormatting" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.document_range_formatting_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/onTypeFormatting" => {
if let Some(options) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.document_on_type_formatting_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
let options = parse_register_or_default(&reg)?;
server.update_capabilities(|capabilities| {
capabilities.document_on_type_formatting_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/formatting" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.document_formatting_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/rename" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.rename_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/inlayHint" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.inlay_hint_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/documentSymbol" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.document_symbol_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/codeAction" => {
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::CodeActionProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
let provider = parse_register_or(&reg, || {
lsp::CodeActionProviderCapability::Simple(true)
})?;
server.update_capabilities(|capabilities| {
capabilities.code_action_provider = Some(provider);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/definition" => {
let options = parse_register_capabilities(reg)?;
let options = parse_register_or(&reg, || OneOf::Left(true))?;
server.update_capabilities(|capabilities| {
capabilities.definition_provider = Some(options);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/completion" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.completion_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let caps = parse_register_or_default(&reg)?;
server.update_capabilities(|capabilities| {
capabilities.completion_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/hover" => {
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::HoverProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
let provider =
parse_register_or(&reg, || lsp::HoverProviderCapability::Simple(true))?;
server.update_capabilities(|capabilities| {
capabilities.hover_provider = Some(provider);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/signatureHelp" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.signature_help_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let caps = parse_register_or_default(&reg)?;
server.update_capabilities(|capabilities| {
capabilities.signature_help_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/didChange" => {
if let Some(sync_kind) = reg
@@ -11877,35 +11853,26 @@ impl LspStore {
}
}
"textDocument/codeLens" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.code_lens_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let caps = parse_register_or(&reg, || lsp::CodeLensOptions {
resolve_provider: None,
})?;
server.update_capabilities(|capabilities| {
capabilities.code_lens_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/diagnostic" => {
if let Some(caps) = reg
.register_options
.map(serde_json::from_value)
.transpose()?
{
server.update_capabilities(|capabilities| {
capabilities.diagnostic_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
let caps = parse_register_or(&reg, || {
lsp::DiagnosticServerCapabilities::Options(lsp::DiagnosticOptions::default())
})?;
server.update_capabilities(|capabilities| {
capabilities.diagnostic_provider = Some(caps);
});
notify_server_capabilities_updated(&server, cx);
}
"textDocument/documentColor" => {
let options = parse_register_capabilities(reg)?;
let provider = match options {
OneOf::Left(value) => lsp::ColorProviderCapability::Simple(value),
OneOf::Right(caps) => caps,
};
let provider =
parse_register_or(&reg, || lsp::ColorProviderCapability::Simple(true))?;
server.update_capabilities(|capabilities| {
capabilities.color_provider = Some(provider);
});
@@ -12166,17 +12133,27 @@ impl LspStore {
}
}
// Registration with registerOptions as null, should fallback to true.
// https://github.com/microsoft/vscode-languageserver-node/blob/d90a87f9557a0df9142cfb33e251cfa6fe27d970/client/src/common/client.ts#L2133
fn parse_register_capabilities<T: serde::de::DeserializeOwned>(
reg: lsp::Registration,
) -> Result<OneOf<bool, T>> {
Ok(match reg.register_options {
Some(options) => OneOf::Right(serde_json::from_value::<T>(options)?),
None => OneOf::Left(true),
// Parse register_options into T or return a provided default if None.
fn parse_register_or<T, F>(reg: &lsp::Registration, default: F) -> Result<T>
where
T: serde::de::DeserializeOwned,
F: FnOnce() -> T,
{
Ok(match reg.register_options.as_ref() {
Some(options) => serde_json::from_value::<T>(options.clone())?,
None => default(),
})
}
// Parse register_options into T or default() if None.
fn parse_register_or_default<T>(reg: &lsp::Registration) -> Result<T>
where
T: serde::de::DeserializeOwned + Default,
{
parse_register_or(reg, T::default)
}
fn subscribe_to_binary_statuses(
languages: &Arc<LanguageRegistry>,
cx: &mut Context<'_, LspStore>,