Browse Source

Language client: cleanup of client capabilities

merge-requests/413/head
eidheim 4 years ago
parent
commit
eb4b1eaf8c
  1. 46
      src/source_language_protocol.cpp

46
src/source_language_protocol.cpp

@ -216,6 +216,7 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
nullptr, "initialize", "\"processId\":" + std::to_string(process_id) + ",\"rootPath\":\"" + JSON::escape_string(root_path.string()) + "\",\"rootUri\":\"" + JSON::escape_string(filesystem::get_uri_from_path(root_path)) + R"(","capabilities": { nullptr, "initialize", "\"processId\":" + std::to_string(process_id) + ",\"rootPath\":\"" + JSON::escape_string(root_path.string()) + "\",\"rootUri\":\"" + JSON::escape_string(filesystem::get_uri_from_path(root_path)) + R"(","capabilities": {
"workspace": { "workspace": {
"symbol": { "dynamicRegistration": false }, "symbol": { "dynamicRegistration": false },
"executeCommand": { "dynamicRegistration": false },
"workspaceFolders": true "workspaceFolders": true
}, },
"textDocument": { "textDocument": {
@ -246,10 +247,6 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
"references": { "dynamicRegistration": false }, "references": { "dynamicRegistration": false },
"documentHighlight": { "dynamicRegistration": false }, "documentHighlight": { "dynamicRegistration": false },
"documentSymbol": { "dynamicRegistration": false }, "documentSymbol": { "dynamicRegistration": false },
"formatting": { "dynamicRegistration": false },
"rangeFormatting": { "dynamicRegistration": false },
"rename": { "dynamicRegistration": false },
"publishDiagnostics": { "relatedInformation":true },
"codeAction": { "codeAction": {
"dynamicRegistration": false, "dynamicRegistration": false,
"resolveSupport": { "resolveSupport": {
@ -270,7 +267,10 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
} }
} }
}, },
"executeCommand": { "dynamicRegistration": false } "formatting": { "dynamicRegistration": false },
"rangeFormatting": { "dynamicRegistration": false },
"rename": { "dynamicRegistration": false },
"publishDiagnostics": { "relatedInformation":true }
} }
}, },
"initializationOptions": { "initializationOptions": {
@ -286,31 +286,39 @@ LanguageProtocol::Capabilities LanguageProtocol::Client::initialize() {
else else
capabilities.text_document_sync = static_cast<LanguageProtocol::Capabilities::TextDocumentSync>(child->integer_or("change", 0)); capabilities.text_document_sync = static_cast<LanguageProtocol::Capabilities::TextDocumentSync>(child->integer_or("change", 0));
} }
capabilities.hover = static_cast<bool>(object->child_optional("hoverProvider"));
if(auto child = object->child_optional("completionProvider")) { if(auto child = object->child_optional("completionProvider")) {
capabilities.completion = true; capabilities.completion = true;
capabilities.completion_resolve = child->boolean_or("resolveProvider", false); capabilities.completion_resolve = child->boolean_or("resolveProvider", false);
} }
/// Some server capabilities are reported as either boolean or objects
auto boolean_or_object = [&object](const std::string &provider) {
if(auto child = object->child_optional(provider))
return child->boolean_or(true);
return false;
};
capabilities.hover = boolean_or_object("hoverProvider");
capabilities.signature_help = static_cast<bool>(object->child_optional("signatureHelpProvider")); capabilities.signature_help = static_cast<bool>(object->child_optional("signatureHelpProvider"));
capabilities.definition = static_cast<bool>(object->child_optional("definitionProvider")); capabilities.definition = boolean_or_object("definitionProvider");
capabilities.type_definition = static_cast<bool>(object->child_optional("typeDefinitionProvider")); capabilities.type_definition = boolean_or_object("typeDefinitionProvider");
capabilities.implementation = static_cast<bool>(object->child_optional("implementationProvider")); capabilities.implementation = boolean_or_object("implementationProvider");
capabilities.references = static_cast<bool>(object->child_optional("referencesProvider")); capabilities.references = boolean_or_object("referencesProvider");
capabilities.document_highlight = static_cast<bool>(object->child_optional("documentHighlightProvider")); capabilities.document_highlight = boolean_or_object("documentHighlightProvider");
capabilities.workspace_symbol = static_cast<bool>(object->child_optional("workspaceSymbolProvider")); capabilities.document_symbol = boolean_or_object("documentSymbolProvider");
capabilities.document_symbol = static_cast<bool>(object->child_optional("documentSymbolProvider"));
capabilities.document_formatting = static_cast<bool>(object->child_optional("documentFormattingProvider"));
capabilities.document_range_formatting = static_cast<bool>(object->child_optional("documentRangeFormattingProvider"));
capabilities.rename = static_cast<bool>(object->child_optional("renameProvider"));
if(auto child = object->child_optional("codeActionProvider")) { if(auto child = object->child_optional("codeActionProvider")) {
capabilities.code_action = true; capabilities.code_action = child->boolean_or(true); // Can be object as well
capabilities.code_action_resolve = child->boolean_or("resolveProvider", false); capabilities.code_action_resolve = child->boolean_or("resolveProvider", false);
} }
capabilities.document_formatting = boolean_or_object("documentFormattingProvider");
capabilities.document_range_formatting = boolean_or_object("documentRangeFormattingProvider");
capabilities.rename = boolean_or_object("renameProvider");
capabilities.execute_command = static_cast<bool>(object->child_optional("executeCommandProvider")); capabilities.execute_command = static_cast<bool>(object->child_optional("executeCommandProvider"));
capabilities.type_coverage = static_cast<bool>(object->child_optional("typeCoverageProvider")); capabilities.type_coverage = static_cast<bool>(object->child_optional("typeCoverageProvider"));
capabilities.workspace_symbol = boolean_or_object("workspaceSymbolProvider");
if(auto workspace = object->object_optional("workspace")) { if(auto workspace = object->object_optional("workspace")) {
if(auto workspace_folders = workspace->object_optional("workspaceFolders")) if(auto workspace_folders = workspace->object_optional("workspaceFolders")) {
capabilities.workspace_folders = static_cast<bool>(workspace_folders->child_optional("changeNotifications")); if(auto change_notifications = workspace_folders->child_optional("changeNotifications"))
capabilities.workspace_folders = change_notifications->boolean_or(true); // Can be string as well
}
} }
} }

Loading…
Cancel
Save