aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient
diff options
context:
space:
mode:
authorDavid Schulz <[email protected]>2021-02-26 08:29:15 +0100
committerDavid Schulz <[email protected]>2021-03-02 12:51:47 +0000
commitd17277b5466ced5c39e615efcc7820be47d770f4 (patch)
treefacc44eac9e00c61145a89c5b37fbb78b9053042 /src/plugins/languageclient
parent687597152e67bd662805bf01ae1202db3ca2db2e (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')
-rw-r--r--src/plugins/languageclient/client.cpp46
-rw-r--r--src/plugins/languageclient/languageclientcompletionassist.cpp2
-rw-r--r--src/plugins/languageclient/languageclientformatter.cpp2
-rw-r--r--src/plugins/languageclient/languageclienthoverhandler.cpp2
-rw-r--r--src/plugins/languageclient/languageclientoutline.cpp2
-rw-r--r--src/plugins/languageclient/languageclientsymbolsupport.cpp6
-rw-r--r--src/plugins/languageclient/languageclientutils.cpp2
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();