// Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "clientcapabilities.h" namespace LanguageServerProtocol { std::optional> SymbolCapabilities::SymbolKindCapabilities::valueSet() const { if (std::optional> array = optionalArray(valueSetKey)) { return std::make_optional( Utils::transform(*array, [](int value) { return static_cast(value); })); } return std::nullopt; } void SymbolCapabilities::SymbolKindCapabilities::setValueSet(const QList &valueSet) { insert(valueSetKey, enumArrayToJsonArray(valueSet)); } std::optional > SymbolCapabilities::SymbolTagCapabilities::valueSet() const { if (std::optional> array = optionalArray(valueSetKey)) { return std::make_optional( Utils::transform(*array, [](int value) { return static_cast(value); })); } return std::nullopt; } void SymbolCapabilities::SymbolTagCapabilities::setValueSet(const QList &valueSet) { insert(valueSetKey, enumArrayToJsonArray(valueSet)); } WorkspaceClientCapabilities::WorkspaceClientCapabilities() { setWorkspaceFolders(true); } std::optional> SemanticTokensClientCapabilities::Requests::range() const { using RetType = std::variant; const QJsonValue &rangeOptions = value(rangeKey); if (rangeOptions.isBool()) return RetType(rangeOptions.toBool()); if (rangeOptions.isObject()) return RetType(rangeOptions.toObject()); return std::nullopt; } void SemanticTokensClientCapabilities::Requests::setRange( const std::variant &range) { insertVariant(rangeKey, range); } std::optional> SemanticTokensClientCapabilities::Requests::full() const { using RetType = std::variant; const QJsonValue &fullOptions = value(fullKey); if (fullOptions.isBool()) return RetType(fullOptions.toBool()); if (fullOptions.isObject()) return RetType(FullSemanticTokenOptions(fullOptions.toObject())); return std::nullopt; } void SemanticTokensClientCapabilities::Requests::setFull( const std::variant &full) { insertVariant(fullKey, full); } std::optional TextDocumentClientCapabilities::semanticTokens() const { return optionalValue(semanticTokensKey); } void TextDocumentClientCapabilities::setSemanticTokens( const SemanticTokensClientCapabilities &semanticTokens) { insert(semanticTokensKey, semanticTokens); } bool SemanticTokensClientCapabilities::isValid() const { return contains(requestsKey) && contains(tokenTypesKey) && contains(tokenModifiersKey) && contains(formatsKey); } const char resourceOperationCreate[] = "create"; const char resourceOperationRename[] = "rename"; const char resourceOperationDelete[] = "delete"; std::optional> WorkspaceClientCapabilities::WorkspaceEditCapabilities::resourceOperations() const { if (!contains(resourceOperationsKey)) return std::nullopt; QList result; for (const QJsonValue &value : this->value(resourceOperationsKey).toArray()) { const QString str = value.toString(); if (str == resourceOperationCreate) result << ResourceOperationKind::Create; else if (str == resourceOperationRename) result << ResourceOperationKind::Rename; else if (str == resourceOperationDelete) result << ResourceOperationKind::Delete; } return result; } void WorkspaceClientCapabilities::WorkspaceEditCapabilities::setResourceOperations( const QList &resourceOperations) { QJsonArray array; for (const auto &kind : resourceOperations) { switch (kind) { case ResourceOperationKind::Create: array << resourceOperationCreate; break; case ResourceOperationKind::Rename: array << resourceOperationRename; break; case ResourceOperationKind::Delete: array << resourceOperationDelete; break; } } insert(resourceOperationsKey, array); } } // namespace LanguageServerProtocol