From 4452f71201e44552c36527c0aeffb1fb9ad025c4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 24 Feb 2022 09:38:59 +0100 Subject: [PATCH] LanguageClient: avoid optional::value Potentially throws std::bad_optional_access. Use operator* and operator-> instead. Change-Id: Idefa137da53f3663ea88961f1105b93402ec4777 Reviewed-by: Eike Ziller Reviewed-by: --- .../clientcapabilities.cpp | 12 +-- .../languageserverprotocol/completion.cpp | 8 +- .../initializemessages.cpp | 12 +-- src/libs/languageserverprotocol/jsonobject.h | 5 +- .../languageserverprotocol/jsonrpcmessages.h | 2 +- .../languagefeatures.cpp | 7 +- src/libs/languageserverprotocol/lsptypes.cpp | 6 +- .../servercapabilities.cpp | 9 +-- src/libs/languageserverprotocol/workspace.cpp | 2 +- src/plugins/clangcodemodel/clangdclient.cpp | 2 +- src/plugins/languageclient/client.cpp | 81 +++++++++---------- .../languageclient/documentsymbolcache.cpp | 2 +- .../languageclientcompletionassist.cpp | 14 ++-- .../languageclientformatter.cpp | 2 +- .../languageclientfunctionhint.cpp | 4 +- .../languageclienthoverhandler.cpp | 9 ++- .../languageclient/languageclientquickfix.cpp | 7 +- .../languageclientsymbolsupport.cpp | 12 ++- .../languageclient/languageclientutils.cpp | 13 ++- src/plugins/languageclient/locatorfilter.cpp | 4 +- .../semantichighlightsupport.cpp | 18 ++--- 21 files changed, 110 insertions(+), 121 deletions(-) diff --git a/src/libs/languageserverprotocol/clientcapabilities.cpp b/src/libs/languageserverprotocol/clientcapabilities.cpp index c3665462f81..33c29df9287 100644 --- a/src/libs/languageserverprotocol/clientcapabilities.cpp +++ b/src/libs/languageserverprotocol/clientcapabilities.cpp @@ -29,12 +29,12 @@ namespace LanguageServerProtocol { Utils::optional > SymbolCapabilities::SymbolKindCapabilities::valueSet() const { - Utils::optional> array = optionalArray(valueSetKey); - if (!array) - return Utils::nullopt; - return Utils::make_optional(Utils::transform(array.value(), [] (int value) { - return static_cast(value); - })); + if (Utils::optional> array = optionalArray(valueSetKey)) { + return Utils::make_optional(Utils::transform(*array, [] (int value) { + return static_cast(value); + })); + } + return Utils::nullopt; } void SymbolCapabilities::SymbolKindCapabilities::setValueSet(const QList &valueSet) diff --git a/src/libs/languageserverprotocol/completion.cpp b/src/libs/languageserverprotocol/completion.cpp index f4e1295d75d..9f04338e87e 100644 --- a/src/libs/languageserverprotocol/completion.cpp +++ b/src/libs/languageserverprotocol/completion.cpp @@ -44,14 +44,12 @@ Utils::optional CompletionItem::documentation() const Utils::optional CompletionItem::insertTextFormat() const { - Utils::optional value = optionalValue(insertTextFormatKey); - return value.has_value() - ? Utils::make_optional(CompletionItem::InsertTextFormat(value.value())) - : Utils::nullopt; + if (Utils::optional value = optionalValue(insertTextFormatKey)) + return Utils::make_optional(CompletionItem::InsertTextFormat(*value)); + return Utils::nullopt; } - CompletionItemResolveRequest::CompletionItemResolveRequest(const CompletionItem ¶ms) : Request(methodName, params) { } diff --git a/src/libs/languageserverprotocol/initializemessages.cpp b/src/libs/languageserverprotocol/initializemessages.cpp index ab09cf1120c..5fcbfa9787a 100644 --- a/src/libs/languageserverprotocol/initializemessages.cpp +++ b/src/libs/languageserverprotocol/initializemessages.cpp @@ -85,12 +85,12 @@ Utils::optional> TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemKindCapabilities:: valueSet() const { - Utils::optional> array = optionalArray(valueSetKey); - if (!array) - return Utils::nullopt; - return Utils::make_optional(Utils::transform(array.value(), [] (int value) { - return static_cast(value); - })); + if (Utils::optional> array = optionalArray(valueSetKey)) { + return Utils::make_optional(Utils::transform(*array, [] (int value) { + return static_cast(value); + })); + } + return Utils::nullopt; } void diff --git a/src/libs/languageserverprotocol/jsonobject.h b/src/libs/languageserverprotocol/jsonobject.h index 3b32ed81f58..9f27b478cd1 100644 --- a/src/libs/languageserverprotocol/jsonobject.h +++ b/src/libs/languageserverprotocol/jsonobject.h @@ -150,9 +150,8 @@ Utils::optional> JsonObject::optionalClientValue(const QS template QList JsonObject::array(const QString &key) const { - const Utils::optional> &array = optionalArray(key); - if (array.has_value()) - return array.value(); + if (const Utils::optional> &array = optionalArray(key)) + return *array; qCDebug(conversionLog) << QString("Expected array under %1 in:").arg(key) << *this; return {}; } diff --git a/src/libs/languageserverprotocol/jsonrpcmessages.h b/src/libs/languageserverprotocol/jsonrpcmessages.h index 010bc770f8a..ad11624a22a 100644 --- a/src/libs/languageserverprotocol/jsonrpcmessages.h +++ b/src/libs/languageserverprotocol/jsonrpcmessages.h @@ -122,7 +122,7 @@ public: virtual bool parametersAreValid(QString *errorMessage) const { if (auto parameter = params()) - return parameter.value().isValid(); + return parameter->isValid(); if (errorMessage) *errorMessage = QCoreApplication::translate("LanguageServerProtocol::Notification", "No parameters in \"%1\".").arg(method()); diff --git a/src/libs/languageserverprotocol/languagefeatures.cpp b/src/libs/languageserverprotocol/languagefeatures.cpp index 08d09cc3b8c..ceea23e569d 100644 --- a/src/libs/languageserverprotocol/languagefeatures.cpp +++ b/src/libs/languageserverprotocol/languagefeatures.cpp @@ -204,10 +204,9 @@ RenameRequest::RenameRequest(const RenameParams ¶ms) Utils::optional DocumentLink::target() const { - Utils::optional optionalTarget = optionalValue(targetKey); - return optionalTarget.has_value() - ? Utils::make_optional(DocumentUri::fromProtocol(optionalTarget.value())) - : Utils::nullopt; + if (Utils::optional optionalTarget = optionalValue(targetKey)) + return Utils::make_optional(DocumentUri::fromProtocol(*optionalTarget)); + return Utils::nullopt; } Utils::optional DocumentLink::data() const diff --git a/src/libs/languageserverprotocol/lsptypes.cpp b/src/libs/languageserverprotocol/lsptypes.cpp index 65651366a3d..92e04f655c6 100644 --- a/src/libs/languageserverprotocol/lsptypes.cpp +++ b/src/libs/languageserverprotocol/lsptypes.cpp @@ -43,7 +43,7 @@ namespace LanguageServerProtocol { Utils::optional Diagnostic::severity() const { if (auto val = optionalValue(severityKey)) - return Utils::make_optional(static_cast(val.value())); + return Utils::make_optional(static_cast(*val)); return Utils::nullopt; } @@ -352,13 +352,13 @@ bool DocumentFilter::applies(const Utils::FilePath &fileName, const Utils::MimeT QRegularExpression::PatternOption option = QRegularExpression::NoPatternOption; if (fileName.caseSensitivity() == Qt::CaseInsensitive) option = QRegularExpression::CaseInsensitiveOption; - const QRegularExpression regexp(expressionForGlob(_pattern.value()), option); + const QRegularExpression regexp(expressionForGlob(*_pattern), option); if (regexp.isValid() && regexp.match(fileName.toString()).hasMatch()) return true; } if (Utils::optional _lang = language()) { auto match = [&_lang](const Utils::MimeType &mimeType){ - return _lang.value() == TextDocumentItem::mimeTypeToLanguageId(mimeType); + return *_lang == TextDocumentItem::mimeTypeToLanguageId(mimeType); }; if (mimeType.isValid() && match(mimeType)) return true; diff --git a/src/libs/languageserverprotocol/servercapabilities.cpp b/src/libs/languageserverprotocol/servercapabilities.cpp index 4a15153bd77..8e2dc530539 100644 --- a/src/libs/languageserverprotocol/servercapabilities.cpp +++ b/src/libs/languageserverprotocol/servercapabilities.cpp @@ -43,13 +43,12 @@ void ServerCapabilities::setTextDocumentSync(const ServerCapabilities::TextDocum TextDocumentSyncKind ServerCapabilities::textDocumentSyncKindHelper() { - Utils::optional sync = textDocumentSync(); - if (sync.has_value()) { - if (auto kind = Utils::get_if(&sync.value())) + if (Utils::optional sync = textDocumentSync()) { + if (auto kind = Utils::get_if(&*sync)) return static_cast(*kind); - if (auto options = Utils::get_if(&sync.value())) { + if (auto options = Utils::get_if(&*sync)) { if (const Utils::optional &change = options->change()) - return static_cast(change.value()); + return static_cast(*change); } } return TextDocumentSyncKind::None; diff --git a/src/libs/languageserverprotocol/workspace.cpp b/src/libs/languageserverprotocol/workspace.cpp index 8b82a70dde4..3244a96bbfb 100644 --- a/src/libs/languageserverprotocol/workspace.cpp +++ b/src/libs/languageserverprotocol/workspace.cpp @@ -81,7 +81,7 @@ ExecuteCommandParams::ExecuteCommandParams(const Command &command) { setCommand(command.command()); if (command.arguments().has_value()) - setArguments(command.arguments().value()); + setArguments(*command.arguments()); } LanguageServerProtocol::WorkSpaceFolderResult::operator const QJsonValue() const diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index b989bba6854..cbc9536f405 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -169,7 +169,7 @@ public: bool detailIs(const QString &s) const { - return detail() && detail().value() == s; + return detail() && *detail() == s; } bool isMemberFunctionCall() const diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index f3b94676673..f4d8974f206 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -380,7 +380,7 @@ void Client::openDocument(TextEditor::TextDocument *document) const FilePath &filePath = document->filePath(); const QString method(DidOpenTextDocumentNotification::methodName); if (Utils::optional registered = m_dynamicCapabilities.isRegistered(method)) { - if (!registered.value()) + if (!*registered) return; const TextDocumentRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); @@ -390,7 +390,7 @@ void Client::openDocument(TextEditor::TextDocument *document) } } else if (Utils::optional _sync = m_serverCapabilities.textDocumentSync()) { - if (auto options = Utils::get_if(&_sync.value())) { + if (auto options = Utils::get_if(&*_sync)) { if (!options->openClose().value_or(true)) return; } @@ -570,7 +570,7 @@ void Client::requestDocumentHighlightsNow(TextEditor::TextEditorWidget *widget) const Id &id = TextEditor::TextEditorWidget::CodeSemanticsSelection; QList selections; const Utils::optional &result = response.result(); - if (!result.has_value() || holds_alternative(result.value())) { + if (!result.has_value() || holds_alternative(*result)) { widget->setExtraSelections(id, selections); return; } @@ -578,7 +578,7 @@ void Client::requestDocumentHighlightsNow(TextEditor::TextEditorWidget *widget) const QTextCharFormat &format = widget->textDocument()->fontSettings().toTextCharFormat(TextEditor::C_OCCURRENCES); QTextDocument *document = widget->document(); - for (const auto &highlight : get>(result.value())) { + for (const auto &highlight : get>(*result)) { QTextEdit::ExtraSelection selection{widget->textCursor(), format}; const int &start = highlight.range().start().toPositionInDocument(document); const int &end = highlight.range().end().toPositionInDocument(document); @@ -663,7 +663,7 @@ void Client::documentContentsSaved(TextEditor::TextDocument *document) bool includeText = false; const QString method(DidSaveTextDocumentNotification::methodName); if (Utils::optional registered = m_dynamicCapabilities.isRegistered(method)) { - sendMessage = registered.value(); + sendMessage = *registered; if (sendMessage) { const TextDocumentSaveRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); @@ -675,9 +675,9 @@ void Client::documentContentsSaved(TextEditor::TextDocument *document) } } else if (Utils::optional _sync = m_serverCapabilities.textDocumentSync()) { - if (auto options = Utils::get_if(&_sync.value())) { + if (auto options = Utils::get_if(&*_sync)) { if (Utils::optional saveOptions = options->save()) - includeText = saveOptions.value().includeText().value_or(includeText); + includeText = saveOptions->includeText().value_or(includeText); } } if (!sendMessage) @@ -698,7 +698,7 @@ void Client::documentWillSave(Core::IDocument *document) bool sendMessage = false; const QString method(WillSaveTextDocumentNotification::methodName); if (Utils::optional registered = m_dynamicCapabilities.isRegistered(method)) { - sendMessage = registered.value(); + sendMessage = *registered; if (sendMessage) { const TextDocumentRegistrationOptions option(m_dynamicCapabilities.option(method)); if (option.isValid()) { @@ -708,7 +708,7 @@ void Client::documentWillSave(Core::IDocument *document) } } else if (Utils::optional _sync = m_serverCapabilities.textDocumentSync()) { - if (auto options = Utils::get_if(&_sync.value())) + if (auto options = Utils::get_if(&*_sync)) sendMessage = options->willSave().value_or(sendMessage); } if (!sendMessage) @@ -728,7 +728,7 @@ void Client::documentContentsChanged(TextEditor::TextDocument *document, const QString method(DidChangeTextDocumentNotification::methodName); TextDocumentSyncKind syncKind = m_serverCapabilities.textDocumentSyncKindHelper(); if (Utils::optional registered = m_dynamicCapabilities.isRegistered(method)) { - syncKind = registered.value() ? TextDocumentSyncKind::Full : TextDocumentSyncKind::None; + syncKind = *registered ? TextDocumentSyncKind::Full : TextDocumentSyncKind::None; if (syncKind != TextDocumentSyncKind::None) { const TextDocumentChangeRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); @@ -920,7 +920,7 @@ void Client::requestCodeActions(const CodeActionRequest &request) const QString method(CodeActionRequest::methodName); if (Utils::optional registered = m_dynamicCapabilities.isRegistered(method)) { - if (!registered.value()) + if (!*registered) return; const TextDocumentRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); @@ -941,9 +941,8 @@ void Client::handleCodeActionResponse(const CodeActionRequest::Response &respons { if (const Utils::optional &error = response.error()) log(*error); - if (const Utils::optional &_result = response.result()) { - const CodeActionResult &result = _result.value(); - if (auto list = Utils::get_if>>(&result)) { + if (const Utils::optional &result = response.result()) { + if (auto list = Utils::get_if>>(&*result)) { for (const Utils::variant &item : *list) { if (auto action = Utils::get_if(&item)) updateCodeActionRefactoringMarker(this, *action, uri); @@ -1269,7 +1268,7 @@ LanguageClientValue Client::showMessageBox( } QHash itemForButton; if (const Utils::optional> actions = message.actions()) { - for (const MessageActionItem &action : actions.value()) + for (const MessageActionItem &action : *actions) itemForButton.insert(box->addButton(action.title(), QMessageBox::InvalidRole), action); } box->exec(); @@ -1538,45 +1537,45 @@ void Client::initializeCallback(const InitializeRequest::Response &initResponse) { QTC_ASSERT(m_state == InitializeRequested, return); if (optional> error = initResponse.error()) { - if (error.value().data().has_value() && error.value().data().value().retry()) { - const QString title(tr("Language Server \"%1\" Initialize Error").arg(m_displayName)); - auto result = QMessageBox::warning(Core::ICore::dialogParent(), - title, - error.value().message(), - QMessageBox::Retry | QMessageBox::Cancel, - QMessageBox::Retry); - if (result == QMessageBox::Retry) { - m_state = Uninitialized; - initialize(); - return; + if (Utils::optional data = error->data()) { + if (data->retry()) { + const QString title(tr("Language Server \"%1\" Initialize Error").arg(m_displayName)); + auto result = QMessageBox::warning(Core::ICore::dialogParent(), + title, + error->message(), + QMessageBox::Retry | QMessageBox::Cancel, + QMessageBox::Retry); + if (result == QMessageBox::Retry) { + m_state = Uninitialized; + initialize(); + return; + } } } - setError(tr("Initialize error: ") + error.value().message()); + setError(tr("Initialize error: ") + error->message()); emit finished(); return; } - const optional &_result = initResponse.result(); - if (!_result.has_value()) {// continue on ill formed result - log(tr("No initialize result.")); - } else { - const InitializeResult &result = _result.value(); - if (!result.isValid()) { // continue on ill formed result - log(QJsonDocument(result).toJson(QJsonDocument::Indented) + '\n' + if (const optional &result = initResponse.result()) { + if (!result->isValid()) { // continue on ill formed result + log(QJsonDocument(*result).toJson(QJsonDocument::Indented) + '\n' + tr("Initialize result is not valid")); } - const Utils::optional serverInfo = result.serverInfo(); + const Utils::optional serverInfo = result->serverInfo(); if (serverInfo) { if (!serverInfo->isValid()) { - log(QJsonDocument(result).toJson(QJsonDocument::Indented) + '\n' + log(QJsonDocument(*result).toJson(QJsonDocument::Indented) + '\n' + tr("Server Info is not valid")); } else { m_serverName = serverInfo->name(); if (const Utils::optional version = serverInfo->version()) - m_serverVersion = version.value(); + m_serverVersion = *version; } } - m_serverCapabilities = result.capabilities(); + m_serverCapabilities = result->capabilities(); + } else { + log(tr("No initialize result.")); } if (auto completionProvider = qobject_cast( @@ -1646,10 +1645,10 @@ bool Client::sendWorkspceFolderChanges() const return true; } if (auto workspace = m_serverCapabilities.workspace()) { - if (auto folder = workspace.value().workspaceFolders()) { - if (folder.value().supported().value_or(false)) { + if (auto folder = workspace->workspaceFolders()) { + if (folder->supported().value_or(false)) { // holds either the Id for deregistration or whether it is registered - auto notification = folder.value().changeNotifications().value_or(false); + auto notification = folder->changeNotifications().value_or(false); return holds_alternative(notification) || (holds_alternative(notification) && get(notification)); } diff --git a/src/plugins/languageclient/documentsymbolcache.cpp b/src/plugins/languageclient/documentsymbolcache.cpp index b621b618223..916fa8d688f 100644 --- a/src/plugins/languageclient/documentsymbolcache.cpp +++ b/src/plugins/languageclient/documentsymbolcache.cpp @@ -117,7 +117,7 @@ void DocumentSymbolCache::handleResponse(const DocumentUri &uri, m_runningRequests.remove(uri); if (Utils::optional error = response.error()) { if (m_client) - m_client->log(error.value()); + m_client->log(*error); } const DocumentSymbolsResult &symbols = response.result().value_or(DocumentSymbolsResult()); m_cache[uri] = symbols; diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index 3cec5a2e491..7024445aa06 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -66,7 +66,7 @@ bool LanguageClientCompletionItem::implicitlyApplies() const bool LanguageClientCompletionItem::prematurelyApplies(const QChar &typedCharacter) const { - if (m_item.commitCharacters().has_value() && m_item.commitCharacters().value().contains(typedCharacter)) { + if (m_item.commitCharacters() && m_item.commitCharacters()->contains(typedCharacter)) { m_triggeredCommitCharacter = typedCharacter; return true; } @@ -194,10 +194,8 @@ bool LanguageClientCompletionItem::hasSortText() const QString LanguageClientCompletionItem::filterText() const { - if (m_filterText.isEmpty()) { - const Utils::optional filterText = m_item.filterText(); - m_filterText = filterText.has_value() ? filterText.value() : m_item.label(); - } + if (m_filterText.isEmpty()) + m_filterText = m_item.filterText().value_or(m_item.label()); return m_filterText; } @@ -211,7 +209,7 @@ bool LanguageClientCompletionItem::isPerfectMatch(int pos, QTextDocument *doc) c QTC_ASSERT(doc, return false); using namespace Utils::Text; if (auto additionalEdits = m_item.additionalTextEdits()) { - if (!additionalEdits.value().isEmpty()) + if (!additionalEdits->isEmpty()) return false; } if (isSnippet()) @@ -393,7 +391,7 @@ void LanguageClientCompletionAssistProcessor::cancel() { if (m_currentRequest.has_value()) { if (m_client) { - m_client->cancelRequest(m_currentRequest.value()); + m_client->cancelRequest(*m_currentRequest); m_client->removeAssistProcessor(this); } m_currentRequest.reset(); @@ -410,7 +408,7 @@ void LanguageClientCompletionAssistProcessor::handleCompletionResponse( m_currentRequest.reset(); QTC_ASSERT(m_client, setAsyncProposalAvailable(nullptr); return); if (auto error = response.error()) - m_client->log(error.value()); + m_client->log(*error); const Utils::optional &result = response.result(); if (!result || Utils::holds_alternative(*result)) { diff --git a/src/plugins/languageclient/languageclientformatter.cpp b/src/plugins/languageclient/languageclientformatter.cpp index 6233d79bcc5..6dcd1a06e48 100644 --- a/src/plugins/languageclient/languageclientformatter.cpp +++ b/src/plugins/languageclient/languageclientformatter.cpp @@ -77,7 +77,7 @@ QFutureWatcher *LanguageClientFormatter::format( const DynamicCapabilities dynamicCapabilities = m_client->dynamicCapabilities(); const QString method(DocumentRangeFormattingRequest::methodName); if (optional registered = dynamicCapabilities.isRegistered(method)) { - if (!registered.value()) + if (!*registered) return nullptr; const TextDocumentRegistrationOptions option(dynamicCapabilities.option(method).toObject()); if (option.isValid() diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index f554d4a3b0e..1e7c6dc551f 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -103,7 +103,7 @@ IAssistProposal *FunctionHintProcessor::perform(const AssistInterface *interface void FunctionHintProcessor::cancel() { if (running()) { - m_client->cancelRequest(m_currentRequest.value()); + m_client->cancelRequest(*m_currentRequest); m_client->removeAssistProcessor(this); m_currentRequest.reset(); } @@ -113,7 +113,7 @@ void FunctionHintProcessor::handleSignatureResponse(const SignatureHelpRequest:: { m_currentRequest.reset(); if (auto error = response.error()) - m_client->log(error.value()); + m_client->log(*error); m_client->removeAssistProcessor(this); auto result = response.result().value_or(LanguageClientValue()); if (result.isNull()) { diff --git a/src/plugins/languageclient/languageclienthoverhandler.cpp b/src/plugins/languageclient/languageclienthoverhandler.cpp index 3fc137f9387..147abd45667 100644 --- a/src/plugins/languageclient/languageclienthoverhandler.cpp +++ b/src/plugins/languageclient/languageclienthoverhandler.cpp @@ -58,7 +58,8 @@ void HoverHandler::setHelpItem(const LanguageServerProtocol::MessageId &msgId, const Core::HelpItem &help) { if (msgId == m_response.id()) { - setContent(m_response.result().value().content()); + if (Utils::optional result = m_response.result()) + setContent(result->content()); m_response = {}; setLastHelpItemIdentified(help); m_report(priority()); @@ -95,7 +96,7 @@ void HoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, sendMessage = Utils::get(*provider); if (Utils::optional registered = m_client->dynamicCapabilities().isRegistered( HoverRequest::methodName)) { - sendMessage = registered.value(); + sendMessage = *registered; if (sendMessage) { const TextDocumentRegistrationOptions option( m_client->dynamicCapabilities().option(HoverRequest::methodName).toObject()); @@ -126,7 +127,7 @@ void HoverHandler::handleResponse(const HoverRequest::Response &response) m_currentRequest.reset(); if (Utils::optional error = response.error()) { if (m_client) - m_client->log(error.value()); + m_client->log(*error); } if (Utils::optional result = response.result()) { if (m_helpItemProvider) { @@ -134,7 +135,7 @@ void HoverHandler::handleResponse(const HoverRequest::Response &response) m_helpItemProvider(response, m_uri); return; } - setContent(result.value().content()); + setContent(result->content()); } m_report(priority()); } diff --git a/src/plugins/languageclient/languageclientquickfix.cpp b/src/plugins/languageclient/languageclientquickfix.cpp index b729bbfafbc..08b96946684 100644 --- a/src/plugins/languageclient/languageclientquickfix.cpp +++ b/src/plugins/languageclient/languageclientquickfix.cpp @@ -108,7 +108,7 @@ IAssistProposal *LanguageClientQuickFixAssistProcessor::perform(const AssistInte void LanguageClientQuickFixAssistProcessor::cancel() { if (running()) { - m_client->cancelRequest(m_currentRequest.value()); + m_client->cancelRequest(*m_currentRequest); m_client->removeAssistProcessor(this); m_currentRequest.reset(); } @@ -120,9 +120,8 @@ void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeA if (const Utils::optional &error = response.error()) m_client->log(*error); QuickFixOperations ops; - if (const Utils::optional &_result = response.result()) { - const CodeActionResult &result = _result.value(); - if (auto list = Utils::get_if>>(&result)) { + if (const Utils::optional &result = response.result()) { + if (auto list = Utils::get_if>>(&*result)) { for (const Utils::variant &item : *list) { if (auto action = Utils::get_if(&item)) ops << new CodeActionQuickFixOperation(*action, m_client); diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 9283dca53cf..10e2d230195 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -76,13 +76,12 @@ static void handleGotoDefinitionResponse(const GotoDefinitionRequest::Response & Utils::ProcessLinkCallback callback, Utils::optional linkUnderCursor) { - if (Utils::optional _result = response.result()) { - const GotoResult result = _result.value(); - if (Utils::holds_alternative(result)) { + if (Utils::optional result = response.result()) { + if (Utils::holds_alternative(*result)) { callback({}); - } else if (auto ploc = Utils::get_if(&result)) { + } else if (auto ploc = Utils::get_if(&*result)) { callback(linkUnderCursor.value_or(ploc->toLink())); - } else if (auto plloc = Utils::get_if>(&result)) { + } else if (auto plloc = Utils::get_if>(&*result)) { if (!plloc->isEmpty()) callback(linkUnderCursor.value_or(plloc->value(0).toLink())); else @@ -206,8 +205,7 @@ void SymbolSupport::handleFindReferencesResponse(const FindReferencesRequest::Re if (result) { Core::SearchResult *search = Core::SearchResultWindow::instance()->startNewSearch( tr("Find References with %1 for:").arg(m_client->name()), "", wordUnderCursor); - search->addResults(generateSearchResultItems(result.value()), - Core::SearchResult::AddOrdered); + search->addResults(generateSearchResultItems(*result), Core::SearchResult::AddOrdered); QObject::connect(search, &Core::SearchResult::activated, [](const Core::SearchResultItem &item) { diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp index 207b5623d28..77c2b20f967 100644 --- a/src/plugins/languageclient/languageclientutils.cpp +++ b/src/plugins/languageclient/languageclientutils.cpp @@ -166,22 +166,21 @@ void updateCodeActionRefactoringMarker(Client *client, marker.type = client->id(); if (action.isValid()) marker.tooltip = action.title(); - if (action.edit().has_value()) { - WorkspaceEdit edit = action.edit().value(); + if (Utils::optional edit = action.edit()) { marker.callback = [client, edit](const TextEditorWidget *) { - applyWorkspaceEdit(client, edit); + applyWorkspaceEdit(client, *edit); }; if (diagnostics.isEmpty()) { QList edits; - if (optional> documentChanges = edit.documentChanges()) { + if (optional> documentChanges = edit->documentChanges()) { QList changesForUri = Utils::filtered( - documentChanges.value(), [uri](const TextDocumentEdit &edit) { + *documentChanges, [uri](const TextDocumentEdit &edit) { return edit.textDocument().uri() == uri; }); for (const TextDocumentEdit &edit : changesForUri) edits << edit.edits(); - } else if (optional localChanges = edit.changes()) { - edits = localChanges.value()[uri]; + } else if (optional localChanges = edit->changes()) { + edits = (*localChanges)[uri]; } for (const TextEdit &edit : qAsConst(edits)) { marker.cursor = endOfLineCursor(edit.range().start().toTextCursor(doc->document())); diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 5ccc4d175a0..e7a6aed4e98 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -210,9 +210,9 @@ QList DocumentLocatorFilter::matchesFor( QTC_ASSERT(m_currentSymbols.has_value(), return {}); - if (auto list = Utils::get_if>(&m_currentSymbols.value())) + if (auto list = Utils::get_if>(&*m_currentSymbols)) return generateEntries(*list, entry); - else if (auto list = Utils::get_if>(&m_currentSymbols.value())) + else if (auto list = Utils::get_if>(&*m_currentSymbols)) return generateEntries(*list, entry); return {}; diff --git a/src/plugins/languageclient/semantichighlightsupport.cpp b/src/plugins/languageclient/semantichighlightsupport.cpp index d6abceaba91..41e88e92288 100644 --- a/src/plugins/languageclient/semantichighlightsupport.cpp +++ b/src/plugins/languageclient/semantichighlightsupport.cpp @@ -301,14 +301,15 @@ SemanticRequestTypes SemanticTokenSupport::supportedSemanticRequests(TextDocumen }; const QString dynamicMethod = "textDocument/semanticTokens"; const DynamicCapabilities &dynamicCapabilities = m_client->dynamicCapabilities(); - if (auto registered = dynamicCapabilities.isRegistered(dynamicMethod); - registered.has_value()) { - if (!registered.value()) + if (auto registered = dynamicCapabilities.isRegistered(dynamicMethod)) { + if (!*registered) return SemanticRequestType::None; return supportedRequests(dynamicCapabilities.option(dynamicMethod).toObject()); } - if (m_client->capabilities().semanticTokensProvider().has_value()) - return supportedRequests(m_client->capabilities().semanticTokensProvider().value()); + if (Utils::optional provider = m_client->capabilities() + .semanticTokensProvider()) { + return supportedRequests(*provider); + } return SemanticRequestType::None; } @@ -359,10 +360,9 @@ void SemanticTokenSupport::handleSemanticTokensDelta( return; for (const auto start = data.begin() + edit.start(); it < start; ++it) newData.append(*it); - const Utils::optional> editData = edit.data(); - if (editData.has_value()) { - newData.append(editData.value()); - qCDebug(LOGLSPHIGHLIGHT) << edit.start() << edit.deleteCount() << editData.value(); + if (const Utils::optional> editData = edit.data()) { + newData.append(*editData); + qCDebug(LOGLSPHIGHLIGHT) << edit.start() << edit.deleteCount() << *editData; } else { qCDebug(LOGLSPHIGHLIGHT) << edit.start() << edit.deleteCount(); }