/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #include "servercapabilities.h" namespace LanguageServerProtocol { Utils::optional ServerCapabilities::textDocumentSync() const { const QJsonValue &sync = value(textDocumentSyncKey); if (sync.isUndefined()) return Utils::nullopt; return Utils::make_optional(sync.isDouble() ? TextDocumentSync(sync.toInt()) : TextDocumentSync(TextDocumentSyncOptions(sync.toObject()))); } void ServerCapabilities::setTextDocumentSync(const ServerCapabilities::TextDocumentSync &textDocumentSync) { insertVariant(textDocumentSyncKey, textDocumentSync); } TextDocumentSyncKind ServerCapabilities::textDocumentSyncKindHelper() { if (Utils::optional sync = textDocumentSync()) { if (auto kind = Utils::get_if(&*sync)) return static_cast(*kind); if (auto options = Utils::get_if(&*sync)) { if (const Utils::optional &change = options->change()) return static_cast(*change); } } return TextDocumentSyncKind::None; } Utils::optional> ServerCapabilities::hoverProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(hoverProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setHoverProvider( const Utils::variant &hoverProvider) { insertVariant(hoverProviderKey, hoverProvider); } Utils::optional> ServerCapabilities::typeDefinitionProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(typeDefinitionProviderKey); if (provider.isUndefined() || !(provider.isBool() || provider.isObject())) return Utils::nullopt; return Utils::make_optional(provider.isBool() ? RetType(provider.toBool()) : RetType(RegistrationOptions(provider.toObject()))); } void ServerCapabilities::setTypeDefinitionProvider( const Utils::variant &typeDefinitionProvider) { insertVariant(typeDefinitionProviderKey, typeDefinitionProvider); } Utils::optional> ServerCapabilities::implementationProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(implementationProviderKey); if (provider.isUndefined() || !(provider.isBool() || provider.isObject())) return Utils::nullopt; return Utils::make_optional(provider.isBool() ? RetType(provider.toBool()) : RetType(RegistrationOptions(provider.toObject()))); } void ServerCapabilities::setImplementationProvider( const Utils::variant &implementationProvider) { insertVariant(implementationProviderKey, implementationProvider); } Utils::optional> ServerCapabilities::referencesProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(referencesProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setReferencesProvider( const Utils::variant &referencesProvider) { insertVariant(referencesProviderKey, referencesProvider); } Utils::optional> ServerCapabilities::documentHighlightProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(documentHighlightProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setDocumentHighlightProvider( const Utils::variant &documentHighlightProvider) { insertVariant(documentHighlightProviderKey, documentHighlightProvider); } Utils::optional> ServerCapabilities::documentSymbolProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(documentSymbolProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setDocumentSymbolProvider( Utils::variant documentSymbolProvider) { insertVariant(documentSymbolProviderKey, documentSymbolProvider); } Utils::optional ServerCapabilities::semanticTokensProvider() const { return optionalValue(semanticTokensProviderKey); } void ServerCapabilities::setSemanticTokensProvider( const SemanticTokensOptions &semanticTokensProvider) { insert(semanticTokensProviderKey, semanticTokensProvider); } Utils::optional> ServerCapabilities::workspaceSymbolProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(workspaceSymbolProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setWorkspaceSymbolProvider( Utils::variant workspaceSymbolProvider) { insertVariant(workspaceSymbolProviderKey, workspaceSymbolProvider); } Utils::optional> ServerCapabilities::codeActionProvider() const { const QJsonValue &provider = value(codeActionProviderKey); if (provider.isBool()) return Utils::make_optional(Utils::variant(provider.toBool())); if (provider.isObject()) { CodeActionOptions options(provider); if (options.isValid()) return Utils::make_optional(Utils::variant(options)); } return Utils::nullopt; } Utils::optional> ServerCapabilities::documentFormattingProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(documentFormattingProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setDocumentFormattingProvider( const Utils::variant &documentFormattingProvider) { insertVariant(documentFormattingProviderKey, documentFormattingProvider); } Utils::optional> ServerCapabilities::documentRangeFormattingProvider() const { using RetType = Utils::variant; const QJsonValue &provider = value(documentRangeFormattingProviderKey); if (provider.isBool()) return Utils::make_optional(RetType(provider.toBool())); if (provider.isObject()) return Utils::make_optional(RetType(WorkDoneProgressOptions(provider.toObject()))); return Utils::nullopt; } void ServerCapabilities::setDocumentRangeFormattingProvider( Utils::variant documentRangeFormattingProvider) { insertVariant(documentRangeFormattingProviderKey, documentRangeFormattingProvider); } Utils::optional> ServerCapabilities::renameProvider() const { using RetType = Utils::variant; const QJsonValue &localValue = value(renameProviderKey); if (localValue.isBool()) return RetType(localValue.toBool()); if (localValue.isObject()) return RetType(RenameOptions(localValue.toObject())); return Utils::nullopt; } void ServerCapabilities::setRenameProvider(Utils::variant renameProvider) { insertVariant(renameProviderKey, renameProvider); } Utils::optional> ServerCapabilities::colorProvider() const { using RetType = Utils::variant; const QJsonValue &localValue = value(colorProviderKey); if (localValue.isBool()) return RetType(localValue.toBool()); if (localValue.isObject()) return RetType(JsonObject(localValue.toObject())); return Utils::nullopt; } void ServerCapabilities::setColorProvider(Utils::variant colorProvider) { insertVariant(renameProviderKey, colorProvider); } Utils::optional > ServerCapabilities::WorkspaceServerCapabilities::WorkspaceFoldersCapabilities::changeNotifications() const { using RetType = Utils::variant; const QJsonValue &change = value(changeNotificationsKey); if (change.isUndefined()) return Utils::nullopt; return Utils::make_optional(change.isBool() ? RetType(change.toBool()) : RetType(change.toString())); } void ServerCapabilities::WorkspaceServerCapabilities::WorkspaceFoldersCapabilities::setChangeNotifications( Utils::variant changeNotifications) { insertVariant(changeNotificationsKey, changeNotifications); } bool TextDocumentRegistrationOptions::filterApplies(const Utils::FilePath &fileName, const Utils::MimeType &mimeType) const { const LanguageClientArray &selector = documentSelector(); return selector.isNull() || selector.toList().isEmpty() || Utils::anyOf(selector.toList(), [&](auto filter){ return filter.applies(fileName, mimeType); }); } bool ServerCapabilities::ExecuteCommandOptions::isValid() const { return WorkDoneProgressOptions::isValid() && contains(commandsKey); } bool CodeActionOptions::isValid() const { return WorkDoneProgressOptions::isValid() && contains(codeActionKindsKey); } Utils::optional> SemanticTokensOptions::range() const { using RetType = Utils::variant; const QJsonValue &rangeOptions = value(rangeKey); if (rangeOptions.isBool()) return RetType(rangeOptions.toBool()); if (rangeOptions.isObject()) return RetType(rangeOptions.toObject()); return Utils::nullopt; } void SemanticTokensOptions::setRange(const Utils::variant &range) { insertVariant(rangeKey, range); } Utils::optional> SemanticTokensOptions::full() const { using RetType = Utils::variant; const QJsonValue &fullOptions = value(fullKey); if (fullOptions.isBool()) return RetType(fullOptions.toBool()); if (fullOptions.isObject()) return RetType(FullSemanticTokenOptions(fullOptions.toObject())); return Utils::nullopt; } void SemanticTokensOptions::setFull( const Utils::variant &full) { insertVariant(fullKey, full); } SemanticRequestTypes SemanticTokensOptions::supportedRequests() const { SemanticRequestTypes result; QJsonValue rangeValue = value(rangeKey); if (rangeValue.isObject() || rangeValue.toBool()) result |= SemanticRequestType::Range; QJsonValue fullValue = value(fullKey); if (fullValue.isObject()) { SemanticTokensOptions::FullSemanticTokenOptions options(fullValue.toObject()); if (options.delta().value_or(false)) result |= SemanticRequestType::FullDelta; result |= SemanticRequestType::Full; } else if (fullValue.toBool()) { result |= SemanticRequestType::Full; } return result; } } // namespace LanguageServerProtocol