diff --git a/src/libs/languageserverprotocol/jsonrpcmessages.h b/src/libs/languageserverprotocol/jsonrpcmessages.h index 1b31e2a6565..bb20ca8a3cd 100644 --- a/src/libs/languageserverprotocol/jsonrpcmessages.h +++ b/src/libs/languageserverprotocol/jsonrpcmessages.h @@ -236,7 +236,7 @@ public: Utils::optional result() const { - const QJsonValue &result = m_jsonObject.value("result"); + const QJsonValue &result = m_jsonObject.value(resultKey); if (result.isUndefined()) return Utils::nullopt; return Utils::make_optional(Result(result)); @@ -259,6 +259,41 @@ public: { return JsonRpcMessage::isValid(errorMessage) && id().isValid(); } }; +template +class Response : public JsonRpcMessage +{ +public: + explicit Response(const MessageId &id) { setId(id); } + using JsonRpcMessage::JsonRpcMessage; + + MessageId id() const + { return MessageId(m_jsonObject.value(idKey)); } + void setId(MessageId id) + { this->m_jsonObject.insert(idKey, id); } + + Utils::optional result() const + { + return m_jsonObject.value(resultKey).isNull() ? Utils::make_optional(nullptr) + : Utils::nullopt; + } + void setResult(const std::nullptr_t &) { m_jsonObject.insert(resultKey, QJsonValue::Null); } + void clearResult() { m_jsonObject.remove(resultKey); } + + using Error = ResponseError; + Utils::optional error() const + { + const QJsonValue &val = m_jsonObject.value(errorKey); + return val.isUndefined() ? Utils::nullopt + : Utils::make_optional(fromJsonValue(val)); + } + void setError(const Error &error) + { m_jsonObject.insert(errorKey, QJsonValue(error)); } + void clearError() { m_jsonObject.remove(errorKey); } + + bool isValid(QString *errorMessage) const override + { return JsonRpcMessage::isValid(errorMessage) && id().isValid(); } +}; + template class Request : public Notification { diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index a2a61f12244..87263038f67 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1293,8 +1293,10 @@ void Client::handleMethod(const QString &method, const MessageId &id, const ICon response.setResult(result); sendContent(response); } else if (method == WorkDoneProgressCreateRequest::methodName) { - sendContent(WorkDoneProgressCreateRequest::Response( - dynamic_cast(content)->id())); + WorkDoneProgressCreateRequest::Response response( + dynamic_cast(content)->id()); + response.setResult(nullptr); + sendContent(response); } else if (method == ProgressNotification::methodName) { if (Utils::optional params = dynamic_cast(content)->params()) {