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 <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2019-03-15 14:53:36 +01:00
parent 35baa3e89d
commit ffcf226a78
4 changed files with 82 additions and 76 deletions

View File

@@ -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<QList<SymbolKind> > SymbolCapabilities::SymbolKindCapabilities::valueSet() const
{
Utils::optional<QList<int>> array = optionalArray<int>(valueSetKey);
@@ -55,13 +42,6 @@ void SymbolCapabilities::SymbolKindCapabilities::setValueSet(const QList<SymbolK
insert(valueSetKey, enumArrayToJsonArray<SymbolKind>(valueSet));
}
ClientCapabilities::ClientCapabilities()
{
setTextDocument(TextDocumentClientCapabilities());
setWorkspace(WorkspaceClientCapabilities());
}
bool ClientCapabilities::isValid(QStringList *error) const
{
return checkOptional<WorkspaceClientCapabilities>(error, workspaceKey)
@@ -85,14 +65,6 @@ bool WorkspaceClientCapabilities::isValid(QStringList *error) const
&& checkOptional<bool>(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<bool>(error, didSaveKey);
}
TextDocumentClientCapabilities::TextDocumentClientCapabilities()
{
setSynchronization(SynchronizationCapabilities());
setDocumentSymbol(SymbolCapabilities());
setCompletion(CompletionCapabilities());
CodeActionCapabilities cac;
CodeActionCapabilities::CodeActionLiteralSupport literalSupport;
literalSupport.setCodeActionKind(
CodeActionCapabilities::CodeActionLiteralSupport::CodeActionKind(QList<QString>{"*"}));
cac.setCodeActionLiteralSupport(literalSupport);
setCodeAction(cac);
}
bool TextDocumentClientCapabilities::isValid(QStringList *error) const
{
return checkOptional<SynchronizationCapabilities>(error, synchronizationKey)
@@ -136,24 +95,12 @@ bool TextDocumentClientCapabilities::isValid(QStringList *error) const
&& checkOptional<DynamicRegistrationCapabilities>(error, renameKey);
}
SymbolCapabilities::SymbolCapabilities()
{
setSymbolKind(SymbolKindCapabilities());
}
bool SymbolCapabilities::isValid(QStringList *error) const
{
return DynamicRegistrationCapabilities::isValid(error)
&& checkOptional<SymbolKindCapabilities>(error, symbolKindKey);
}
TextDocumentClientCapabilities::CompletionCapabilities::CompletionCapabilities()
{
setDynamicRegistration(true);
setCompletionItem(CompletionItemCapbilities());
setCompletionItemKind(CompletionItemKindCapabilities());
}
bool TextDocumentClientCapabilities::CompletionCapabilities::isValid(QStringList *error) const
{
return DynamicRegistrationCapabilities::isValid(error)

View File

@@ -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.

View File

@@ -54,10 +54,6 @@ QString Trace::toString() const
}
#undef RETURN_CASE
TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities::CompletionItemCapbilities()
{
}
Utils::optional<QList<MarkupKind>>
TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities::
documentationFormat() const

View File

@@ -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<QString>{"*"}));
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){