diff options
Diffstat (limited to 'src/shared/lsp/clientcapabilities.h')
-rw-r--r-- | src/shared/lsp/clientcapabilities.h | 674 |
1 files changed, 674 insertions, 0 deletions
diff --git a/src/shared/lsp/clientcapabilities.h b/src/shared/lsp/clientcapabilities.h new file mode 100644 index 000000000..44add0a2c --- /dev/null +++ b/src/shared/lsp/clientcapabilities.h @@ -0,0 +1,674 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "jsonkeys.h" +#include "lsptypes.h" +#include "semantictokens.h" + +namespace lsp { + +class LANGUAGESERVERPROTOCOL_EXPORT DynamicRegistrationCapabilities : public JsonObject +{ +public: + using JsonObject::JsonObject; + + std::optional<bool> dynamicRegistration() const + { + return optionalValue<bool>(dynamicRegistrationKey); + } + void setDynamicRegistration(bool dynamicRegistration) { insert(dynamicRegistrationKey, dynamicRegistration); } + void clearDynamicRegistration() { remove(dynamicRegistrationKey); } +}; + +class LANGUAGESERVERPROTOCOL_EXPORT FullSemanticTokenOptions : public JsonObject +{ +public: + using JsonObject::JsonObject; + + /** + * The client will send the `textDocument/semanticTokens/full/delta` + * request if the server provides a corresponding handler. + */ + std::optional<bool> delta() const { return optionalValue<bool>(deltaKey); } + void setDelta(bool delta) { insert(deltaKey, delta); } + void clearDelta() { remove(deltaKey); } +}; + +class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensClientCapabilities : public DynamicRegistrationCapabilities +{ +public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + class LANGUAGESERVERPROTOCOL_EXPORT Requests : public JsonObject + { + /** + * Which requests the client supports and might send to the server + * depending on the server's capability. Please note that clients might not + * show semantic tokens or degrade some of the user experience if a range + * or full request is advertised by the client but not provided by the + * server. If for example the client capability `requests.full` and + * `request.range` are both set to true but the server only provides a + * range provider the client might not render a minimap correctly or might + * even decide to not show any semantic tokens at all. + */ + public: + using JsonObject::JsonObject; + + /** + * The client will send the `textDocument/semanticTokens/range` request + * if the server provides a corresponding handler. + */ + std::optional<std::variant<bool, QJsonObject>> range() const; + void setRange(const std::variant<bool, QJsonObject> &range); + void clearRange() { remove(rangeKey); } + + /** + * The client will send the `textDocument/semanticTokens/full` request + * if the server provides a corresponding handler. + */ + std::optional<std::variant<bool, FullSemanticTokenOptions>> full() const; + void setFull(const std::variant<bool, FullSemanticTokenOptions> &full); + void clearFull() { remove(fullKey); } + }; + + Requests requests() const { return typedValue<Requests>(requestsKey); } + void setRequests(const Requests &requests) { insert(requestsKey, requests); } + + /// The token types that the client supports. + QList<QString> tokenTypes() const { return array<QString>(tokenTypesKey); } + void setTokenTypes(const QList<QString> &value) { insertArray(tokenTypesKey, value); } + + /// The token modifiers that the client supports. + QList<QString> tokenModifiers() const { return array<QString>(tokenModifiersKey); } + void setTokenModifiers(const QList<QString> &value) { insertArray(tokenModifiersKey, value); } + + /// The formats the clients supports. + QList<QString> formats() const { return array<QString>(formatsKey); } + void setFormats(const QList<QString> &value) { insertArray(formatsKey, value); } + + /// Whether the client supports tokens that can overlap each other. + std::optional<bool> overlappingTokenSupport() const + { + return optionalValue<bool>(overlappingTokenSupportKey); + } + void setOverlappingTokenSupport(bool overlappingTokenSupport) { insert(overlappingTokenSupportKey, overlappingTokenSupport); } + void clearOverlappingTokenSupport() { remove(overlappingTokenSupportKey); } + + /// Whether the client supports tokens that can span multiple lines. + std::optional<bool> multiLineTokenSupport() const + { + return optionalValue<bool>(multiLineTokenSupportKey); + } + void setMultiLineTokenSupport(bool multiLineTokenSupport) { insert(multiLineTokenSupportKey, multiLineTokenSupport); } + void clearMultiLineTokenSupport() { remove(multiLineTokenSupportKey); } + + bool isValid() const override; +}; + +class LANGUAGESERVERPROTOCOL_EXPORT SymbolCapabilities : public DynamicRegistrationCapabilities +{ +public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + + class LANGUAGESERVERPROTOCOL_EXPORT SymbolKindCapabilities : public JsonObject + { + public: + using JsonObject::JsonObject; + + /* + * The symbol kind values the client supports. When this + * property exists the client also guarantees that it will + * handle values outside its set gracefully and falls back + * to a default value when unknown. + * + * If this property is not present the client only supports + * the symbol kinds from `File` to `Array` as defined in + * the initial version of the protocol. + */ + std::optional<QList<SymbolKind>> valueSet() const; + void setValueSet(const QList<SymbolKind> &valueSet); + void clearValueSet() { remove(valueSetKey); } + }; + + // Specific capabilities for the `SymbolKind` in the `workspace/symbol` request. + std::optional<SymbolKindCapabilities> symbolKind() const + { return optionalValue<SymbolKindCapabilities>(symbolKindKey); } + void setSymbolKind(const SymbolKindCapabilities &symbolKind) { insert(symbolKindKey, symbolKind); } + void clearSymbolKind() { remove(symbolKindKey); } + + std::optional<bool> hierarchicalDocumentSymbolSupport() const + { return optionalValue<bool>(hierarchicalDocumentSymbolSupportKey); } + void setHierarchicalDocumentSymbolSupport(bool hierarchicalDocumentSymbolSupport) + { insert(hierarchicalDocumentSymbolSupportKey, hierarchicalDocumentSymbolSupport); } + void clearHierachicalDocumentSymbolSupport() { remove(hierarchicalDocumentSymbolSupportKey); } +}; + +class LANGUAGESERVERPROTOCOL_EXPORT TextDocumentClientCapabilities : public JsonObject +{ +public: + using JsonObject::JsonObject; + + class LANGUAGESERVERPROTOCOL_EXPORT SynchronizationCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + + // The client supports sending will save notifications. + std::optional<bool> willSave() const { return optionalValue<bool>(willSaveKey); } + void setWillSave(bool willSave) { insert(willSaveKey, willSave); } + void clearWillSave() { remove(willSaveKey); } + + /* + * The client supports sending a will save request and + * waits for a response providing text edits which will + * be applied to the document before it is saved. + */ + std::optional<bool> willSaveWaitUntil() const + { return optionalValue<bool>(willSaveWaitUntilKey); } + void setWillSaveWaitUntil(bool willSaveWaitUntil) + { insert(willSaveWaitUntilKey, willSaveWaitUntil); } + void clearWillSaveWaitUntil() { remove(willSaveWaitUntilKey); } + + // The client supports did save notifications. + std::optional<bool> didSave() const { return optionalValue<bool>(didSaveKey); } + void setDidSave(bool didSave) { insert(didSaveKey, didSave); } + void clearDidSave() { remove(didSaveKey); } + }; + + std::optional<SynchronizationCapabilities> synchronization() const + { return optionalValue<SynchronizationCapabilities>(synchronizationKey); } + void setSynchronization(const SynchronizationCapabilities &synchronization) + { insert(synchronizationKey, synchronization); } + void clearSynchronization() { remove(synchronizationKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT CompletionCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + + class LANGUAGESERVERPROTOCOL_EXPORT CompletionItemCapbilities : public JsonObject + { + public: + using JsonObject::JsonObject; + + /* + * Client supports snippets as insert text. + * + * A snippet can define tab stops and placeholders with `$1`, `$2` + * and `${3:foo}`. `$0` defines the final tab stop, it defaults to + * the end of the snippet. Placeholders with equal identifiers are linked, + * that is typing in one will update others too. + */ + std::optional<bool> snippetSupport() const + { return optionalValue<bool>(snippetSupportKey); } + void setSnippetSupport(bool snippetSupport) + { insert(snippetSupportKey, snippetSupport); } + void clearSnippetSupport() { remove(snippetSupportKey); } + + // Client supports commit characters on a completion item. + std::optional<bool> commitCharacterSupport() const + { return optionalValue<bool>(commitCharacterSupportKey); } + void setCommitCharacterSupport(bool commitCharacterSupport) + { insert(commitCharacterSupportKey, commitCharacterSupport); } + void clearCommitCharacterSupport() { remove(commitCharacterSupportKey); } + + /* + * Client supports the follow content formats for the documentation + * property. The order describes the preferred format of the client. + */ + std::optional<QList<MarkupKind>> documentationFormat() const; + void setDocumentationFormat(const QList<MarkupKind> &documentationFormat); + void clearDocumentationFormat() { remove(documentationFormatKey); } + }; + + // The client supports the following `CompletionItem` specific capabilities. + std::optional<CompletionItemCapbilities> completionItem() const + { return optionalValue<CompletionItemCapbilities>(completionItemKey); } + void setCompletionItem(const CompletionItemCapbilities &completionItem) + { insert(completionItemKey, completionItem); } + void clearCompletionItem() { remove(completionItemKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT CompletionItemKindCapabilities : public JsonObject + { + public: + CompletionItemKindCapabilities(); + using JsonObject::JsonObject; + /* + * The completion item kind values the client supports. When this + * property exists the client also guarantees that it will + * handle values outside its set gracefully and falls back + * to a default value when unknown. + * + * If this property is not present the client only supports + * the completion items kinds from `Text` to `Reference` as defined in + * the initial version of the protocol. + */ + std::optional<QList<CompletionItemKind::Kind>> valueSet() const; + void setValueSet(const QList<CompletionItemKind::Kind> &valueSet); + void clearValueSet() { remove(valueSetKey); } + }; + + std::optional<CompletionItemKindCapabilities> completionItemKind() const + { return optionalValue<CompletionItemKindCapabilities>(completionItemKindKey); } + void setCompletionItemKind(const CompletionItemKindCapabilities &completionItemKind) + { insert(completionItemKindKey, completionItemKind); } + void clearCompletionItemKind() { remove(completionItemKindKey); } + + /* + * The client supports to send additional context information for a + * `textDocument/completion` request. + */ + std::optional<bool> contextSupport() const + { + return optionalValue<bool>(contextSupportKey); + } + void setContextSupport(bool contextSupport) { insert(contextSupportKey, contextSupport); } + void clearContextSupport() { remove(contextSupportKey); } + }; + + // Capabilities specific to the `textDocument/completion` + std::optional<CompletionCapabilities> completion() const + { return optionalValue<CompletionCapabilities>(completionKey); } + void setCompletion(const CompletionCapabilities &completion) + { insert(completionKey, completion); } + void clearCompletion() { remove(completionKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT HoverCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + /* + * Client supports the follow content formats for the content + * property. The order describes the preferred format of the client. + */ + std::optional<QList<MarkupKind>> contentFormat() const; + void setContentFormat(const QList<MarkupKind> &contentFormat); + void clearContentFormat() { remove(contentFormatKey); } + }; + + std::optional<HoverCapabilities> hover() const + { + return optionalValue<HoverCapabilities>(hoverKey); + } + void setHover(const HoverCapabilities &hover) { insert(hoverKey, hover); } + void clearHover() { remove(hoverKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT SignatureHelpCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + + class LANGUAGESERVERPROTOCOL_EXPORT SignatureInformationCapabilities : public JsonObject + { + public: + using JsonObject::JsonObject; + /* + * Client supports the follow content formats for the documentation + * property. The order describes the preferred format of the client. + */ + std::optional<QList<MarkupKind>> documentationFormat() const; + void setDocumentationFormat(const QList<MarkupKind> &documentationFormat); + void clearDocumentationFormat() { remove(documentationFormatKey); } + + std::optional<bool> activeParameterSupport() const + { return optionalValue<bool>(activeParameterSupportKey); } + void setActiveParameterSupport(bool activeParameterSupport) + { insert(activeParameterSupportKey, activeParameterSupport); } + void clearActiveParameterSupport() { remove(activeParameterSupportKey); } + }; + + // The client supports the following `SignatureInformation` specific properties. + std::optional<SignatureInformationCapabilities> signatureInformation() const + { return optionalValue<SignatureInformationCapabilities>(signatureInformationKey); } + void setSignatureInformation(const SignatureInformationCapabilities &signatureInformation) + { insert(signatureInformationKey, signatureInformation); } + void clearSignatureInformation() { remove(signatureInformationKey); } + }; + + // Capabilities specific to the `textDocument/signatureHelp` + std::optional<SignatureHelpCapabilities> signatureHelp() const + { return optionalValue<SignatureHelpCapabilities>(signatureHelpKey); } + void setSignatureHelp(const SignatureHelpCapabilities &signatureHelp) + { insert(signatureHelpKey, signatureHelp); } + void clearSignatureHelp() { remove(signatureHelpKey); } + + // Whether references supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> references() const + { return optionalValue<DynamicRegistrationCapabilities>(referencesKey); } + void setReferences(const DynamicRegistrationCapabilities &references) + { insert(referencesKey, references); } + void clearReferences() { remove(referencesKey); } + + // Whether document highlight supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> documentHighlight() const + { return optionalValue<DynamicRegistrationCapabilities>(documentHighlightKey); } + void setDocumentHighlight(const DynamicRegistrationCapabilities &documentHighlight) + { insert(documentHighlightKey, documentHighlight); } + void clearDocumentHighlight() { remove(documentHighlightKey); } + + // Capabilities specific to the `textDocument/documentSymbol` + std::optional<SymbolCapabilities> documentSymbol() const + { return optionalValue<SymbolCapabilities>(documentSymbolKey); } + void setDocumentSymbol(const SymbolCapabilities &documentSymbol) + { insert(documentSymbolKey, documentSymbol); } + void clearDocumentSymbol() { remove(documentSymbolKey); } + + // Whether formatting supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> formatting() const + { return optionalValue<DynamicRegistrationCapabilities>(formattingKey); } + void setFormatting(const DynamicRegistrationCapabilities &formatting) + { insert(formattingKey, formatting); } + void clearFormatting() { remove(formattingKey); } + + // Whether range formatting supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> rangeFormatting() const + { return optionalValue<DynamicRegistrationCapabilities>(rangeFormattingKey); } + void setRangeFormatting(const DynamicRegistrationCapabilities &rangeFormatting) + { insert(rangeFormattingKey, rangeFormatting); } + void clearRangeFormatting() { remove(rangeFormattingKey); } + + // Whether on type formatting supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> onTypeFormatting() const + { return optionalValue<DynamicRegistrationCapabilities>(onTypeFormattingKey); } + void setOnTypeFormatting(const DynamicRegistrationCapabilities &onTypeFormatting) + { insert(onTypeFormattingKey, onTypeFormatting); } + void clearOnTypeFormatting() { remove(onTypeFormattingKey); } + + // Whether definition supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> definition() const + { return optionalValue<DynamicRegistrationCapabilities>(definitionKey); } + void setDefinition(const DynamicRegistrationCapabilities &definition) + { insert(definitionKey, definition); } + void clearDefinition() { remove(definitionKey); } + + /* + * Whether typeDefinition supports dynamic registration. If this is set to `true` + * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)` + * return value for the corresponding server capability as well. + */ + std::optional<DynamicRegistrationCapabilities> typeDefinition() const + { return optionalValue<DynamicRegistrationCapabilities>(typeDefinitionKey); } + void setTypeDefinition(const DynamicRegistrationCapabilities &typeDefinition) + { insert(typeDefinitionKey, typeDefinition); } + void clearTypeDefinition() { remove(typeDefinitionKey); } + + /* + * Whether implementation supports dynamic registration. If this is set to `true` + * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)` + * return value for the corresponding server capability as well. + */ + std::optional<DynamicRegistrationCapabilities> implementation() const + { return optionalValue<DynamicRegistrationCapabilities>(implementationKey); } + void setImplementation(const DynamicRegistrationCapabilities &implementation) + { insert(implementationKey, implementation); } + void clearImplementation() { remove(implementationKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionLiteralSupport : public JsonObject + { + public: + using JsonObject::JsonObject; + + class LANGUAGESERVERPROTOCOL_EXPORT CodeActionKind : public JsonObject + { + public: + using JsonObject::JsonObject; + CodeActionKind() : CodeActionKind(QList<QString>()) {} + explicit CodeActionKind(const QList<QString> &kinds) { setValueSet(kinds); } + + QList<QString> valueSet() const { return array<QString>(valueSetKey); } + void setValueSet(const QList<QString> &valueSet) + { insertArray(valueSetKey, valueSet); } + + bool isValid() const override { return contains(valueSetKey); } + }; + + CodeActionKind codeActionKind() const + { return typedValue<CodeActionKind>(codeActionKindKey); } + void setCodeActionKind(const CodeActionKind &codeActionKind) + { insert(codeActionKindKey, codeActionKind); } + + bool isValid() const override { return contains(codeActionKindKey); } + }; + + std::optional<CodeActionLiteralSupport> codeActionLiteralSupport() const + { return optionalValue<CodeActionLiteralSupport>(codeActionLiteralSupportKey); } + void setCodeActionLiteralSupport(const CodeActionLiteralSupport &codeActionLiteralSupport) + { insert(codeActionLiteralSupportKey, codeActionLiteralSupport); } + void clearCodeActionLiteralSupport() { remove(codeActionLiteralSupportKey); } + }; + + // Whether code action supports dynamic registration. + std::optional<CodeActionCapabilities> codeAction() const + { return optionalValue<CodeActionCapabilities>(codeActionKey); } + void setCodeAction(const CodeActionCapabilities &codeAction) + { insert(codeActionKey, codeAction); } + void clearCodeAction() { remove(codeActionKey); } + + // Whether code lens supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> codeLens() const + { return optionalValue<DynamicRegistrationCapabilities>(codeLensKey); } + void setCodeLens(const DynamicRegistrationCapabilities &codeLens) + { insert(codeLensKey, codeLens); } + void clearCodeLens() { remove(codeLensKey); } + + // Whether document link supports dynamic registration. + std::optional<DynamicRegistrationCapabilities> documentLink() const + { return optionalValue<DynamicRegistrationCapabilities>(documentLinkKey); } + void setDocumentLink(const DynamicRegistrationCapabilities &documentLink) + { insert(documentLinkKey, documentLink); } + void clearDocumentLink() { remove(documentLinkKey); } + + /* + * Whether colorProvider supports dynamic registration. If this is set to `true` + * the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)` + * return value for the corresponding server capability as well. + */ + std::optional<DynamicRegistrationCapabilities> colorProvider() const + { return optionalValue<DynamicRegistrationCapabilities>(colorProviderKey); } + void setColorProvider(const DynamicRegistrationCapabilities &colorProvider) + { insert(colorProviderKey, colorProvider); } + void clearColorProvider() { remove(colorProviderKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT RenameClientCapabilities : public DynamicRegistrationCapabilities + { + public: + using DynamicRegistrationCapabilities::DynamicRegistrationCapabilities; + /** + * Client supports testing for validity of rename operations + * before execution. + * + * @since version 3.12.0 + */ + + std::optional<bool> prepareSupport() const + { + return optionalValue<bool>(prepareSupportKey); + } + void setPrepareSupport(bool prepareSupport) { insert(prepareSupportKey, prepareSupport); } + void clearPrepareSupport() { remove(prepareSupportKey); } + }; + + // Whether rename supports dynamic registration. + std::optional<RenameClientCapabilities> rename() const + { return optionalValue<RenameClientCapabilities>(renameKey); } + void setRename(const RenameClientCapabilities &rename) + { insert(renameKey, rename); } + void clearRename() { remove(renameKey); } + + std::optional<SemanticTokensClientCapabilities> semanticTokens() const; + void setSemanticTokens(const SemanticTokensClientCapabilities &semanticTokens); + void clearSemanticTokens() { remove(semanticTokensKey); } + + std::optional<DynamicRegistrationCapabilities> callHierarchy() const + { return optionalValue<DynamicRegistrationCapabilities>(callHierarchyKey); } + void setCallHierarchy(const DynamicRegistrationCapabilities &callHierarchy) + { insert(callHierarchyKey, callHierarchy); } + void clearCallHierarchy() { remove(callHierarchyKey); } +}; + +class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensWorkspaceClientCapabilities : public JsonObject +{ +public: + using JsonObject::JsonObject; + /** + * Whether the client implementation supports a refresh request sent from + * the server to the client. + * + * Note that this event is global and will force the client to refresh all + * semantic tokens currently shown. It should be used with absolute care + * and is useful for situation where a server for example detect a project + * wide change that requires such a calculation. + */ + std::optional<bool> refreshSupport() const { return optionalValue<bool>(refreshSupportKey); } + void setRefreshSupport(bool refreshSupport) { insert(refreshSupportKey, refreshSupport); } + void clearRefreshSupport() { remove(refreshSupportKey); } +}; + +class LANGUAGESERVERPROTOCOL_EXPORT WorkspaceClientCapabilities : public JsonObject +{ +public: + WorkspaceClientCapabilities(); + using JsonObject::JsonObject; + + /* + * The client supports applying batch edits to the workspace by supporting the request + * 'workspace/applyEdit' + */ + std::optional<bool> applyEdit() const { return optionalValue<bool>(applyEditKey); } + void setApplyEdit(bool applyEdit) { insert(applyEditKey, applyEdit); } + void clearApplyEdit() { remove(applyEditKey); } + + class LANGUAGESERVERPROTOCOL_EXPORT WorkspaceEditCapabilities : public JsonObject + { + public: + using JsonObject::JsonObject; + + // The client supports versioned document changes in `WorkspaceEdit`s + std::optional<bool> documentChanges() const + { return optionalValue<bool>(documentChangesKey); } + void setDocumentChanges(bool documentChanges) + { insert(documentChangesKey, documentChanges); } + void clearDocumentChanges() { remove(documentChangesKey); } + + enum class ResourceOperationKind { Create, Rename, Delete }; + + // The resource operations the client supports. Clients should at least support 'create', + // 'rename' and 'delete' files and folders. + std::optional<QList<ResourceOperationKind>> resourceOperations() const; + void setResourceOperations(const QList<ResourceOperationKind> &resourceOperations); + void clearResourceOperations() { remove(resourceOperationsKey); } + }; + + // Capabilities specific to `WorkspaceEdit`s + std::optional<WorkspaceEditCapabilities> workspaceEdit() const + { return optionalValue<WorkspaceEditCapabilities>(workspaceEditKey); } + void setWorkspaceEdit(const WorkspaceEditCapabilities &workspaceEdit) + { insert(workspaceEditKey, workspaceEdit); } + void clearWorkspaceEdit() { remove(workspaceEditKey); } + + // Capabilities specific to the `workspace/didChangeConfiguration` notification. + std::optional<DynamicRegistrationCapabilities> didChangeConfiguration() const + { return optionalValue<DynamicRegistrationCapabilities>(didChangeConfigurationKey); } + void setDidChangeConfiguration(const DynamicRegistrationCapabilities &didChangeConfiguration) + { insert(didChangeConfigurationKey, didChangeConfiguration); } + void clearDidChangeConfiguration() { remove(didChangeConfigurationKey); } + + // Capabilities specific to the `workspace/didChangeWatchedFiles` notification. + std::optional<DynamicRegistrationCapabilities> didChangeWatchedFiles() const + { return optionalValue<DynamicRegistrationCapabilities>(didChangeWatchedFilesKey); } + void setDidChangeWatchedFiles(const DynamicRegistrationCapabilities &didChangeWatchedFiles) + { insert(didChangeWatchedFilesKey, didChangeWatchedFiles); } + void clearDidChangeWatchedFiles() { remove(didChangeWatchedFilesKey); } + + // Specific capabilities for the `SymbolKind` in the `workspace/symbol` request. + std::optional<SymbolCapabilities> symbol() const + { return optionalValue<SymbolCapabilities>(symbolKey); } + void setSymbol(const SymbolCapabilities &symbol) { insert(symbolKey, symbol); } + void clearSymbol() { remove(symbolKey); } + + // Capabilities specific to the `workspace/executeCommand` request. + std::optional<DynamicRegistrationCapabilities> executeCommand() const + { return optionalValue<DynamicRegistrationCapabilities>(executeCommandKey); } + void setExecuteCommand(const DynamicRegistrationCapabilities &executeCommand) + { insert(executeCommandKey, executeCommand); } + void clearExecuteCommand() { remove(executeCommandKey); } + + // The client has support for workspace folders. Since 3.6.0 + std::optional<bool> workspaceFolders() const + { return optionalValue<bool>(workspaceFoldersKey); } + void setWorkspaceFolders(bool workspaceFolders) + { insert(workspaceFoldersKey, workspaceFolders); } + void clearWorkspaceFolders() { remove(workspaceFoldersKey); } + + // The client supports `workspace/configuration` requests. Since 3.6.0 + std::optional<bool> configuration() const { return optionalValue<bool>(configurationKey); } + void setConfiguration(bool configuration) { insert(configurationKey, configuration); } + void clearConfiguration() { remove(configurationKey); } + + std::optional<SemanticTokensWorkspaceClientCapabilities> semanticTokens() const + { return optionalValue<SemanticTokensWorkspaceClientCapabilities>(semanticTokensKey); } + void setSemanticTokens(const SemanticTokensWorkspaceClientCapabilities &semanticTokens) + { insert(semanticTokensKey, semanticTokens); } + void clearSemanticTokens() { remove(semanticTokensKey); } +}; + +class WindowClientClientCapabilities : public JsonObject +{ +public: + using JsonObject::JsonObject; + + /** + * Whether client supports handling progress notifications. + * If set, servers are allowed to report in `workDoneProgress` property + * in the request specific server capabilities. + * + */ + std::optional<bool> workDoneProgress() const + { return optionalValue<bool>(workDoneProgressKey); } + void setWorkDoneProgress(bool workDoneProgress) + { insert(workDoneProgressKey, workDoneProgress); } + void clearWorkDoneProgress() { remove(workDoneProgressKey); } + +private: + constexpr static const char workDoneProgressKey[] = "workDoneProgress"; +}; + +class LANGUAGESERVERPROTOCOL_EXPORT ClientCapabilities : public JsonObject +{ +public: + using JsonObject::JsonObject; + + // Workspace specific client capabilities. + std::optional<WorkspaceClientCapabilities> workspace() const + { return optionalValue<WorkspaceClientCapabilities>(workspaceKey); } + void setWorkspace(const WorkspaceClientCapabilities &workspace) + { insert(workspaceKey, workspace); } + void clearWorkspace() { remove(workspaceKey); } + + // Text document specific client capabilities. + std::optional<TextDocumentClientCapabilities> textDocument() const + { return optionalValue<TextDocumentClientCapabilities>(textDocumentKey); } + void setTextDocument(const TextDocumentClientCapabilities &textDocument) + { insert(textDocumentKey, textDocument); } + void clearTextDocument() { remove(textDocumentKey); } + + // Window specific client capabilities. + std::optional<WindowClientClientCapabilities> window() const + { return optionalValue<WindowClientClientCapabilities>(windowKey); } + void setWindow(const WindowClientClientCapabilities &window) + { insert(windowKey, window); } + void clearWindow() { remove(windowKey); } + + // Experimental client capabilities. + QJsonValue experimental() const { return value(experimentalKey); } + void setExperimental(const QJsonValue &experimental) { insert(experimentalKey, experimental); } + void clearExperimental() { remove(experimentalKey); } +}; + +} // namespace lsp |