diff options
author | David Schulz <[email protected]> | 2021-02-26 08:29:15 +0100 |
---|---|---|
committer | David Schulz <[email protected]> | 2021-03-02 12:51:47 +0000 |
commit | d17277b5466ced5c39e615efcc7820be47d770f4 (patch) | |
tree | facc44eac9e00c61145a89c5b37fbb78b9053042 /src/plugins/languageclient | |
parent | 687597152e67bd662805bf01ae1202db3ca2db2e (diff) |
LSP: reduce error handling complexity
Instead of checking recursively every possible object just check the
required keys for an object and validate it on construction or
assignment from json.
This will reduce the implementation effort for protocol extensions and
also reduce the false positives we might get if the protocol gets
updated.
Change-Id: I3df24e62430d2c7575d26c1581e6a9606e7da4c1
Reviewed-by: hjk <[email protected]>
Reviewed-by: Christian Stenger <[email protected]>
Diffstat (limited to 'src/plugins/languageclient')
7 files changed, 30 insertions, 32 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index ce2184d303a..881f94dd45e 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -314,7 +314,7 @@ void Client::openDocument(TextEditor::TextDocument *document) return; const TextDocumentRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); - if (option.isValid(nullptr) + if (option.isValid() && !option.filterApplies(filePath, Utils::mimeTypeForName(document->mimeType()))) { return; } @@ -387,7 +387,7 @@ void Client::updateCompletionProvider(TextEditor::TextDocument *document) Utils::mimeTypeForName(document->mimeType())); const ServerCapabilities::CompletionOptions completionOptions(options); - if (completionOptions.isValid(nullptr)) + if (completionOptions.isValid()) clientCompletionProvider->setTriggerCharacters(completionOptions.triggerCharacters()); } @@ -415,7 +415,7 @@ void Client::updateFunctionHintProvider(TextEditor::TextDocument *document) Utils::mimeTypeForName(document->mimeType())); const ServerCapabilities::SignatureHelpOptions signatureOptions(options); - if (signatureOptions.isValid(nullptr)) + if (signatureOptions.isValid()) clientFunctionHintProvider->setTriggerCharacters(signatureOptions.triggerCharacters()); } @@ -488,7 +488,7 @@ void Client::documentContentsSaved(TextEditor::TextDocument *document) if (sendMessage) { const TextDocumentSaveRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); - if (option.isValid(nullptr)) { + if (option.isValid()) { sendMessage = option.filterApplies(document->filePath(), Utils::mimeTypeForName(document->mimeType())); includeText = option.includeText().value_or(includeText); @@ -522,7 +522,7 @@ void Client::documentWillSave(Core::IDocument *document) sendMessage = registered.value(); if (sendMessage) { const TextDocumentRegistrationOptions option(m_dynamicCapabilities.option(method)); - if (option.isValid(nullptr)) { + if (option.isValid()) { sendMessage = option.filterApplies(filePath, Utils::mimeTypeForName(document->mimeType())); } @@ -553,7 +553,7 @@ void Client::documentContentsChanged(TextEditor::TextDocument *document, if (syncKind != TextDocumentSyncKind::None) { const TextDocumentChangeRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); - syncKind = option.isValid(nullptr) ? option.syncKind() : syncKind; + syncKind = option.isValid() ? option.syncKind() : syncKind; } } @@ -618,7 +618,7 @@ void Client::unregisterCapabilities(const QList<Unregistration> &unregistrations TextEditor::HighlightingResult createHighlightingResult(const SymbolInformation &info) { - if (!info.isValid(nullptr)) + if (!info.isValid()) return {}; const Position &start = info.location().range().start(); return TextEditor::HighlightingResult(start.line() + 1, @@ -730,7 +730,7 @@ void Client::requestCodeActions(const CodeActionRequest &request) return; const TextDocumentRegistrationOptions option( m_dynamicCapabilities.option(method).toObject()); - if (option.isValid(nullptr) && !option.filterApplies(fileName)) + if (option.isValid() && !option.filterApplies(fileName)) return; } else { Utils::variant<bool, CodeActionOptions> provider @@ -965,8 +965,8 @@ void Client::showMessageBox(const ShowMessageRequestParams &message, const Messa connect(box, &QMessageBox::finished, this, [=]{ ShowMessageRequest::Response response(id); const MessageActionItem &item = itemForButton.value(box->clickedButton()); - response.setResult(item.isValid(nullptr) ? LanguageClientValue<MessageActionItem>(item) - : LanguageClientValue<MessageActionItem>()); + response.setResult(item.isValid() ? LanguageClientValue<MessageActionItem>(item) + : LanguageClientValue<MessageActionItem>()); sendContent(response); }); box->show(); @@ -1032,40 +1032,39 @@ void Client::handleResponse(const MessageId &id, const QByteArray &content, QTex void Client::handleMethod(const QString &method, const MessageId &id, const IContent *content) { - ErrorHierarchy error; auto logError = [&](const JsonObject &content) { log(QJsonDocument(content).toJson(QJsonDocument::Indented) + '\n' - + tr("Invalid parameter in \"%1\": %2").arg(method, error.toString())); + + tr("Invalid parameter in \"%1\"").arg(method)); }; if (method == PublishDiagnosticsNotification::methodName) { auto params = dynamic_cast<const PublishDiagnosticsNotification *>(content)->params().value_or(PublishDiagnosticsParams()); - if (params.isValid(&error)) + if (params.isValid()) handleDiagnostics(params); else logError(params); } else if (method == LogMessageNotification::methodName) { auto params = dynamic_cast<const LogMessageNotification *>(content)->params().value_or(LogMessageParams()); - if (params.isValid(&error)) + if (params.isValid()) log(params); else logError(params); } else if (method == SemanticHighlightNotification::methodName) { auto params = dynamic_cast<const SemanticHighlightNotification *>(content)->params().value_or(SemanticHighlightingParams()); - if (params.isValid(&error)) + if (params.isValid()) handleSemanticHighlight(params); else logError(params); } else if (method == ShowMessageNotification::methodName) { auto params = dynamic_cast<const ShowMessageNotification *>(content)->params().value_or(ShowMessageParams()); - if (params.isValid(&error)) + if (params.isValid()) log(params); else logError(params); } else if (method == ShowMessageRequest::methodName) { auto request = dynamic_cast<const ShowMessageRequest *>(content); auto params = request->params().value_or(ShowMessageRequestParams()); - if (params.isValid(&error)) { + if (params.isValid()) { showMessageBox(params, request->id()); } else { ShowMessageRequest::Response response(request->id()); @@ -1080,19 +1079,19 @@ void Client::handleMethod(const QString &method, const MessageId &id, const ICon } } else if (method == RegisterCapabilityRequest::methodName) { auto params = dynamic_cast<const RegisterCapabilityRequest *>(content)->params().value_or(RegistrationParams()); - if (params.isValid(&error)) + if (params.isValid()) registerCapabilities(params.registrations()); else logError(params); } else if (method == UnregisterCapabilityRequest::methodName) { auto params = dynamic_cast<const UnregisterCapabilityRequest *>(content)->params().value_or(UnregistrationParams()); - if (params.isValid(&error)) + if (params.isValid()) unregisterCapabilities(params.unregistrations()); else logError(params); } else if (method == ApplyWorkspaceEditRequest::methodName) { auto params = dynamic_cast<const ApplyWorkspaceEditRequest *>(content)->params().value_or(ApplyWorkspaceEditParams()); - if (params.isValid(&error)) + if (params.isValid()) applyWorkspaceEdit(params.edit()); else logError(params); @@ -1111,7 +1110,7 @@ void Client::handleMethod(const QString &method, const MessageId &id, const ICon } response.setResult(result); sendContent(response); - } else if (id.isValid(&error)) { + } else if (id.isValid()) { Response<JsonObject, JsonObject> response(id); ResponseError<JsonObject> error; error.setCode(ResponseError<JsonObject>::MethodNotFound); @@ -1208,10 +1207,9 @@ void Client::initializeCallback(const InitializeRequest::Response &initResponse) log(tr("No initialize result.")); } else { const InitializeResult &result = _result.value(); - ErrorHierarchy error; - if (!result.isValid(&error)) { // continue on ill formed result + if (!result.isValid()) { // continue on ill formed result log(QJsonDocument(result).toJson(QJsonDocument::Indented) + '\n' - + tr("Initialize result is not valid: ") + error.toString()); + + tr("Initialize result is not valid")); } m_serverCapabilities = result.capabilities().value_or(ServerCapabilities()); diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index a0a9abd6cf1..a866cd6ba91 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -184,7 +184,7 @@ bool LanguageClientCompletionItem::isSnippet() const bool LanguageClientCompletionItem::isValid() const { - return m_item.isValid(nullptr); + return m_item.isValid(); } quint64 LanguageClientCompletionItem::hash() const diff --git a/src/plugins/languageclient/languageclientformatter.cpp b/src/plugins/languageclient/languageclientformatter.cpp index 31883d5fef0..566d1c829af 100644 --- a/src/plugins/languageclient/languageclientformatter.cpp +++ b/src/plugins/languageclient/languageclientformatter.cpp @@ -80,7 +80,7 @@ QFutureWatcher<ChangeSet> *LanguageClientFormatter::format( if (!registered.value()) return nullptr; const TextDocumentRegistrationOptions option(dynamicCapabilities.option(method).toObject()); - if (option.isValid(nullptr) + if (option.isValid() && !option.filterApplies(filePath, Utils::mimeTypeForName(m_document->mimeType()))) { return nullptr; } diff --git a/src/plugins/languageclient/languageclienthoverhandler.cpp b/src/plugins/languageclient/languageclienthoverhandler.cpp index 3ef437ac793..f9533ab4708 100644 --- a/src/plugins/languageclient/languageclienthoverhandler.cpp +++ b/src/plugins/languageclient/languageclienthoverhandler.cpp @@ -85,7 +85,7 @@ void HoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, if (sendMessage) { const TextDocumentRegistrationOptions option( m_client->dynamicCapabilities().option(HoverRequest::methodName).toObject()); - if (option.isValid(nullptr)) { + if (option.isValid()) { sendMessage = option.filterApplies(editorWidget->textDocument()->filePath(), Utils::mimeTypeForName( editorWidget->textDocument()->mimeType())); diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index 622b0100f08..c83a35411f8 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -231,7 +231,7 @@ bool LanguageClientOutlineWidgetFactory::clientSupportsDocumentSymbols( DynamicCapabilities dc = client->dynamicCapabilities(); if (dc.isRegistered(DocumentSymbolsRequest::methodName).value_or(false)) { TextDocumentRegistrationOptions options(dc.option(DocumentSymbolsRequest::methodName)); - return !options.isValid(nullptr) + return !options.isValid() || options.filterApplies(doc->filePath(), Utils::mimeTypeForName(doc->mimeType())); } const Utils::optional<Utils::variant<bool, WorkDoneProgressOptions>> &provider diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 8a29d0e510c..fc752548f07 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -56,7 +56,7 @@ static void sendTextDocumentPositionParamsRequest(Client *client, if (sendMessage) { const TextDocumentRegistrationOptions option( dynamicCapabilities.option(Request::methodName)); - if (option.isValid(nullptr)) + if (option.isValid()) sendMessage = option.filterApplies( Utils::FilePath::fromString(QUrl(uri).adjusted(QUrl::PreferLocalFile).toString())); else @@ -248,7 +248,7 @@ static bool supportsRename(Client *client, prepareSupported = ServerCapabilities::RenameOptions(options).prepareProvider().value_or( false); const TextDocumentRegistrationOptions docOps(options); - if (docOps.isValid(nullptr) + if (docOps.isValid() && !docOps.filterApplies(document->filePath(), Utils::mimeTypeForName(document->mimeType()))) { return false; @@ -411,7 +411,7 @@ void SymbolSupport::applyRename(const QList<Core::SearchResultItem> &checkedItem for (const Core::SearchResultItem &item : checkedItems) { auto uri = DocumentUri::fromFilePath(Utils::FilePath::fromString(item.path().value(0))); TextEdit edit(item.userData().toJsonObject()); - if (edit.isValid(nullptr)) + if (edit.isValid()) editsForDocuments[uri] << edit; } diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp index 7f1f396d1f0..b94a9fc1c9e 100644 --- a/src/plugins/languageclient/languageclientutils.cpp +++ b/src/plugins/languageclient/languageclientutils.cpp @@ -152,7 +152,7 @@ void updateCodeActionRefactoringMarker(Client *client, RefactorMarkers markers; RefactorMarker marker; marker.type = client->id(); - if (action.isValid(nullptr)) + if (action.isValid()) marker.tooltip = action.title(); if (action.edit().has_value()) { WorkspaceEdit edit = action.edit().value(); |