From ffcf226a7850a902e125ecbef75c257a7817243d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 15 Mar 2019 14:53:36 +0100 Subject: [PATCH] LSP: generate capabilities in a central place Also remove the creator default capabilities from the default constructor of the general client capabilities in Utils. Change-Id: Ifdaaf1bfb5047197e37ba84773552648132df3e8 Reviewed-by: Christian Stenger --- .../clientcapabilities.cpp | 53 -------------- .../clientcapabilities.h | 31 ++++---- .../initializemessages.cpp | 4 -- src/plugins/languageclient/client.cpp | 70 +++++++++++++++++++ 4 files changed, 82 insertions(+), 76 deletions(-) diff --git a/src/libs/languageserverprotocol/clientcapabilities.cpp b/src/libs/languageserverprotocol/clientcapabilities.cpp index 02002504442..f73c4ee04ce 100644 --- a/src/libs/languageserverprotocol/clientcapabilities.cpp +++ b/src/libs/languageserverprotocol/clientcapabilities.cpp @@ -27,19 +27,6 @@ namespace LanguageServerProtocol { -SymbolCapabilities::SymbolKindCapabilities::SymbolKindCapabilities() -{ - setValueSet({SymbolKind::File, SymbolKind::Module, SymbolKind::Namespace, - SymbolKind::Package, SymbolKind::Class, SymbolKind::Method, - SymbolKind::Property, SymbolKind::Field, SymbolKind::Constructor, - SymbolKind::Enum, SymbolKind::Interface, SymbolKind::Function, - SymbolKind::Variable, SymbolKind::Constant, SymbolKind::String, - SymbolKind::Number, SymbolKind::Boolean, SymbolKind::Array, - SymbolKind::Object, SymbolKind::Key, SymbolKind::Null, - SymbolKind::EnumMember, SymbolKind::Struct, SymbolKind::Event, - SymbolKind::Operator, SymbolKind::TypeParameter}); -} - Utils::optional > SymbolCapabilities::SymbolKindCapabilities::valueSet() const { Utils::optional> array = optionalArray(valueSetKey); @@ -55,13 +42,6 @@ void SymbolCapabilities::SymbolKindCapabilities::setValueSet(const QList(valueSet)); } - -ClientCapabilities::ClientCapabilities() -{ - setTextDocument(TextDocumentClientCapabilities()); - setWorkspace(WorkspaceClientCapabilities()); -} - bool ClientCapabilities::isValid(QStringList *error) const { return checkOptional(error, workspaceKey) @@ -85,14 +65,6 @@ bool WorkspaceClientCapabilities::isValid(QStringList *error) const && checkOptional(error,configurationKey); } -TextDocumentClientCapabilities::SynchronizationCapabilities::SynchronizationCapabilities() -{ - setDynamicRegistration(true); - setWillSave(true); - setWillSaveWaitUntil(false); - setDidSave(true); -} - bool TextDocumentClientCapabilities::SynchronizationCapabilities::isValid(QStringList *error) const { return DynamicRegistrationCapabilities::isValid(error) @@ -101,19 +73,6 @@ bool TextDocumentClientCapabilities::SynchronizationCapabilities::isValid(QStrin && checkOptional(error, didSaveKey); } -TextDocumentClientCapabilities::TextDocumentClientCapabilities() -{ - setSynchronization(SynchronizationCapabilities()); - setDocumentSymbol(SymbolCapabilities()); - setCompletion(CompletionCapabilities()); - CodeActionCapabilities cac; - CodeActionCapabilities::CodeActionLiteralSupport literalSupport; - literalSupport.setCodeActionKind( - CodeActionCapabilities::CodeActionLiteralSupport::CodeActionKind(QList{"*"})); - cac.setCodeActionLiteralSupport(literalSupport); - setCodeAction(cac); -} - bool TextDocumentClientCapabilities::isValid(QStringList *error) const { return checkOptional(error, synchronizationKey) @@ -136,24 +95,12 @@ bool TextDocumentClientCapabilities::isValid(QStringList *error) const && checkOptional(error, renameKey); } -SymbolCapabilities::SymbolCapabilities() -{ - setSymbolKind(SymbolKindCapabilities()); -} - bool SymbolCapabilities::isValid(QStringList *error) const { return DynamicRegistrationCapabilities::isValid(error) && checkOptional(error, symbolKindKey); } -TextDocumentClientCapabilities::CompletionCapabilities::CompletionCapabilities() -{ - setDynamicRegistration(true); - setCompletionItem(CompletionItemCapbilities()); - setCompletionItemKind(CompletionItemKindCapabilities()); -} - bool TextDocumentClientCapabilities::CompletionCapabilities::isValid(QStringList *error) const { return DynamicRegistrationCapabilities::isValid(error) diff --git a/src/libs/languageserverprotocol/clientcapabilities.h b/src/libs/languageserverprotocol/clientcapabilities.h index c10341b3f02..3664007dd19 100644 --- a/src/libs/languageserverprotocol/clientcapabilities.h +++ b/src/libs/languageserverprotocol/clientcapabilities.h @@ -46,13 +46,11 @@ public: class LANGUAGESERVERPROTOCOL_EXPORT SymbolCapabilities : public DynamicRegistrationCapabilities { public: - SymbolCapabilities(); using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; - class SymbolKindCapabilities : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT SymbolKindCapabilities : public JsonObject { public: - SymbolKindCapabilities(); using JsonObject::JsonObject; /* @@ -85,13 +83,11 @@ public: class LANGUAGESERVERPROTOCOL_EXPORT TextDocumentClientCapabilities : public JsonObject { public: - TextDocumentClientCapabilities(); using JsonObject::JsonObject; - class SynchronizationCapabilities : public DynamicRegistrationCapabilities + class LANGUAGESERVERPROTOCOL_EXPORT SynchronizationCapabilities : public DynamicRegistrationCapabilities { public: - SynchronizationCapabilities(); using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; // The client supports sending will save notifications. @@ -124,16 +120,14 @@ public: { insert(synchronizationKey, synchronization); } void clearSynchronization() { remove(synchronizationKey); } - class CompletionCapabilities : public DynamicRegistrationCapabilities + class LANGUAGESERVERPROTOCOL_EXPORT CompletionCapabilities : public DynamicRegistrationCapabilities { public: - CompletionCapabilities(); using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; - class CompletionItemCapbilities : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT CompletionItemCapbilities : public JsonObject { public: - CompletionItemCapbilities(); using JsonObject::JsonObject; /* @@ -180,7 +174,7 @@ public: { insert(completionItemKey, completionItem); } void clearCompletionItem() { remove(completionItemKey); } - class CompletionItemKindCapabilities : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT CompletionItemKindCapabilities : public JsonObject { public: CompletionItemKindCapabilities(); @@ -227,7 +221,7 @@ public: { insert(completionKey, completion); } void clearCompletion() { remove(completionKey); } - class HoverCapabilities : public DynamicRegistrationCapabilities + class LANGUAGESERVERPROTOCOL_EXPORT HoverCapabilities : public DynamicRegistrationCapabilities { public: using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; @@ -246,12 +240,12 @@ public: void setHover(const HoverCapabilities &hover) { insert(hoverKey, hover); } void clearHover() { remove(hoverKey); } - class SignatureHelpCapabilities : public DynamicRegistrationCapabilities + class LANGUAGESERVERPROTOCOL_EXPORT SignatureHelpCapabilities : public DynamicRegistrationCapabilities { public: using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; - class SignatureInformationCapabilities : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT SignatureInformationCapabilities : public JsonObject { public: using JsonObject::JsonObject; @@ -355,17 +349,17 @@ public: { insert(implementationKey, implementation); } void clearImplementation() { remove(implementationKey); } - class CodeActionCapabilities : public DynamicRegistrationCapabilities + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionCapabilities : public DynamicRegistrationCapabilities { public: using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; - class CodeActionLiteralSupport : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionLiteralSupport : public JsonObject { public: using JsonObject::JsonObject; - class CodeActionKind : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionKind : public JsonObject { public: using JsonObject::JsonObject; @@ -454,7 +448,7 @@ public: void setApplyEdit(bool applyEdit) { insert(applyEditKey, applyEdit); } void clearApplyEdit() { remove(applyEditKey); } - class WorkspaceEditCapabilities : public JsonObject + class LANGUAGESERVERPROTOCOL_EXPORT WorkspaceEditCapabilities : public JsonObject { public: using JsonObject::JsonObject; @@ -522,7 +516,6 @@ public: class LANGUAGESERVERPROTOCOL_EXPORT ClientCapabilities : public JsonObject { public: - ClientCapabilities(); using JsonObject::JsonObject; // Workspace specific client capabilities. diff --git a/src/libs/languageserverprotocol/initializemessages.cpp b/src/libs/languageserverprotocol/initializemessages.cpp index 0464f8a13cc..f892a4b7e68 100644 --- a/src/libs/languageserverprotocol/initializemessages.cpp +++ b/src/libs/languageserverprotocol/initializemessages.cpp @@ -54,10 +54,6 @@ QString Trace::toString() const } #undef RETURN_CASE -TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities::CompletionItemCapbilities() -{ -} - Utils::optional> TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities:: documentationFormat() const diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index c0cbcb7254a..d3f4091ff72 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -122,6 +122,75 @@ Client::~Client() removeDiagnostics(uri); } +static ClientCapabilities generateClientCapabilities() +{ + ClientCapabilities capabilities; + WorkspaceClientCapabilities workspaceCapabilities; + workspaceCapabilities.setWorkspaceFolders(true); + workspaceCapabilities.setApplyEdit(true); + DynamicRegistrationCapabilities allowDynamicRegistration; + allowDynamicRegistration.setDynamicRegistration(true); + workspaceCapabilities.setDidChangeConfiguration(allowDynamicRegistration); + workspaceCapabilities.setExecuteCommand(allowDynamicRegistration); + capabilities.setWorkspace(workspaceCapabilities); + + TextDocumentClientCapabilities documentCapabilities; + TextDocumentClientCapabilities::SynchronizationCapabilities syncCapabilities; + syncCapabilities.setDynamicRegistration(true); + syncCapabilities.setWillSave(true); + syncCapabilities.setWillSaveWaitUntil(false); + syncCapabilities.setDidSave(true); + documentCapabilities.setSynchronization(syncCapabilities); + + SymbolCapabilities symbolCapabilities; + SymbolCapabilities::SymbolKindCapabilities symbolKindCapabilities; + symbolKindCapabilities.setValueSet( + {SymbolKind::File, SymbolKind::Module, SymbolKind::Namespace, + SymbolKind::Package, SymbolKind::Class, SymbolKind::Method, + SymbolKind::Property, SymbolKind::Field, SymbolKind::Constructor, + SymbolKind::Enum, SymbolKind::Interface, SymbolKind::Function, + SymbolKind::Variable, SymbolKind::Constant, SymbolKind::String, + SymbolKind::Number, SymbolKind::Boolean, SymbolKind::Array, + SymbolKind::Object, SymbolKind::Key, SymbolKind::Null, + SymbolKind::EnumMember, SymbolKind::Struct, SymbolKind::Event, + SymbolKind::Operator, SymbolKind::TypeParameter}); + symbolCapabilities.setSymbolKind(symbolKindCapabilities); + documentCapabilities.setDocumentSymbol(symbolCapabilities); + + TextDocumentClientCapabilities::CompletionCapabilities completionCapabilities; + completionCapabilities.setDynamicRegistration(true); + TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemKindCapabilities + completionItemKindCapabilities; + completionItemKindCapabilities.setValueSet( + {CompletionItemKind::Text, CompletionItemKind::Method, + CompletionItemKind::Function, CompletionItemKind::Constructor, + CompletionItemKind::Field, CompletionItemKind::Variable, + CompletionItemKind::Class, CompletionItemKind::Interface, + CompletionItemKind::Module, CompletionItemKind::Property, + CompletionItemKind::Unit, CompletionItemKind::Value, + CompletionItemKind::Enum, CompletionItemKind::Keyword, + CompletionItemKind::Snippet, CompletionItemKind::Color, + CompletionItemKind::File, CompletionItemKind::Reference, + CompletionItemKind::Folder, CompletionItemKind::EnumMember, + CompletionItemKind::Constant, CompletionItemKind::Struct, + CompletionItemKind::Event, CompletionItemKind::Operator, + CompletionItemKind::TypeParameter}); + + completionCapabilities.setCompletionItemKind(completionItemKindCapabilities); + documentCapabilities.setCompletion(completionCapabilities); + + TextDocumentClientCapabilities::CodeActionCapabilities codeActionCapabilities; + TextDocumentClientCapabilities::CodeActionCapabilities::CodeActionLiteralSupport literalSupport; + literalSupport.setCodeActionKind( + TextDocumentClientCapabilities::CodeActionCapabilities::CodeActionLiteralSupport:: + CodeActionKind(QList{"*"})); + codeActionCapabilities.setCodeActionLiteralSupport(literalSupport); + documentCapabilities.setCodeAction(codeActionCapabilities); + capabilities.setTextDocument(documentCapabilities); + + return capabilities; +} + void Client::initialize() { using namespace ProjectExplorer; @@ -131,6 +200,7 @@ void Client::initialize() auto initRequest = new InitializeRequest(); if (auto startupProject = SessionManager::startupProject()) { auto params = initRequest->params().value_or(InitializeParams()); + params.setCapabilities(generateClientCapabilities()); params.setRootUri(DocumentUri::fromFileName(startupProject->projectDirectory())); initRequest->setParams(params); params.setWorkSpaceFolders(Utils::transform(SessionManager::projects(), [](Project *pro){