From 248ebb494d6902bb743b162a93429fba28968bf3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 28 Apr 2021 09:25:25 +0200 Subject: [PATCH] LanguageClient: Expose server information Server name and version are potentially interesting information. Change-Id: I4fc9a2556d7fd8285fe0024cf0f83baf95112e65 Reviewed-by: David Schulz --- .../languageserverprotocol/initializemessages.h | 14 ++++++++++++++ src/libs/languageserverprotocol/jsonkeys.h | 1 + src/plugins/languageclient/client.cpp | 11 +++++++++++ src/plugins/languageclient/client.h | 4 ++++ 4 files changed, 30 insertions(+) diff --git a/src/libs/languageserverprotocol/initializemessages.h b/src/libs/languageserverprotocol/initializemessages.h index 35a1b3d8f4d..b8a4bf7da49 100644 --- a/src/libs/languageserverprotocol/initializemessages.h +++ b/src/libs/languageserverprotocol/initializemessages.h @@ -136,6 +136,17 @@ public: bool parametersAreValid(QString * /*errorMessage*/) const final { return true; } }; +class LANGUAGESERVERPROTOCOL_EXPORT ServerInfo : public JsonObject +{ +public: + using JsonObject::JsonObject; + + QString name() const { return typedValue(nameKey); } + Utils::optional version() const { return optionalValue(versionKey); } + + bool isValid() const override { return contains(nameKey); } +}; + class LANGUAGESERVERPROTOCOL_EXPORT InitializeResult : public JsonObject { public: @@ -146,6 +157,9 @@ public: void setCapabilities(const ServerCapabilities &capabilities) { insert(capabilitiesKey, capabilities); } + Utils::optional serverInfo() const + { return optionalValue(serverInfoKey); } + bool isValid() const override { return contains(capabilitiesKey); } }; diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index 029a4a8b28a..44978e4fc86 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -190,6 +190,7 @@ constexpr char semanticHighlightingCapabilitiesKey[] = "semanticHighlightingCapa constexpr char semanticHighlightingKey[] = "semanticHighlighting"; constexpr char semanticTokensKey[] = "semanticTokens"; constexpr char semanticTokensProviderKey[] = "semanticTokensProvider"; +constexpr char serverInfoKey[] = "serverInfo"; constexpr char settingsKey[] = "settings"; constexpr char severityKey[] = "severity"; constexpr char signatureHelpKey[] = "signatureHelp"; diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 2ea0af4551e..2f01115d4bf 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1347,6 +1347,17 @@ void Client::initializeCallback(const InitializeRequest::Response &initResponse) log(QJsonDocument(result).toJson(QJsonDocument::Indented) + '\n' + tr("Initialize result is not valid")); } + const Utils::optional serverInfo = result.serverInfo(); + if (serverInfo) { + if (!serverInfo->isValid()) { + 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_serverCapabilities = result.capabilities(); } diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 131337ad2b8..0c17be217f3 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -116,6 +116,8 @@ public: static LanguageServerProtocol::ClientCapabilities defaultClientCapabilities(); void setClientCapabilities(const LanguageServerProtocol::ClientCapabilities &caps); const LanguageServerProtocol::ServerCapabilities &capabilities() const; + QString serverName() const { return m_serverName; } + QString serverVersion() const { return m_serverVersion; } const DynamicCapabilities &dynamicCapabilities() const; void registerCapabilities(const QList ®istrations); void unregisterCapabilities(const QList &unregistrations); @@ -259,6 +261,8 @@ private: ProgressManager m_progressManager; bool m_activateDocAutomatically = false; SemanticTokenSupport m_tokentSupport; + QString m_serverName; + QString m_serverVersion; bool m_locatorsEnabled = true; };