Git commit f7eee57fe832dd8df262356373468f24e807e9ac by Christoph Cullmann, on behalf of Mark Nauwelaerts. Committed on 11/12/2022 at 13:43. Pushed by cullmann into branch 'master'.
lspclient: optionally adjust the trigger character sets suggested by servers M +12 -0 addons/lspclient/lspclientserver.cpp M +8 -0 addons/lspclient/lspclientserver.h M +23 -1 addons/lspclient/lspclientservermanager.cpp M +4 -0 doc/kate/plugins.docbook https://invent.kde.org/utilities/kate/commit/f7eee57fe832dd8df262356373468f24e807e9ac diff --git a/addons/lspclient/lspclientserver.cpp b/addons/lspclient/lspclientserver.cpp index f8db5502a..227bcbf69 100644 --- a/addons/lspclient/lspclientserver.cpp +++ b/addons/lspclient/lspclientserver.cpp @@ -1356,10 +1356,22 @@ private: } } + void applyTriggerOverride(QVector<QChar> &characters, const TriggerCharactersOverride &adjust) + { + // these are expected 'small' sets, so the simple way should do + for (const auto &c : adjust.exclude) { + characters.removeAll(c); + } + characters.append(adjust.include); + } + void onInitializeReply(const QJsonValue &value) { // only parse parts that we use later on from_json(m_capabilities, value.toObject().value(QStringLiteral("capabilities")).toObject()); + // tweak triggers as specified + applyTriggerOverride(m_capabilities.completionProvider.triggerCharacters, m_config.completion); + applyTriggerOverride(m_capabilities.signatureHelpProvider.triggerCharacters, m_config.signature); // finish init initialized(); } diff --git a/addons/lspclient/lspclientserver.h b/addons/lspclient/lspclientserver.h index fe63c24a4..51def7fdc 100644 --- a/addons/lspclient/lspclientserver.h +++ b/addons/lspclient/lspclientserver.h @@ -106,11 +106,19 @@ public: using FoldersType = std::optional<QList<LSPWorkspaceFolder>>; + // optionally adjust server provided/suggest trigger characters + struct TriggerCharactersOverride { + QVector<QChar> exclude; + QVector<QChar> include; + }; + // collect additional tweaks into a helper struct to avoid ever growing parameter list // (which then also needs to be duplicated in a few places) struct ExtraServerConfig { FoldersType folders; LSPClientCapabilities caps; + TriggerCharactersOverride completion; + TriggerCharactersOverride signature; }; LSPClientServer(const QStringList &server, diff --git a/addons/lspclient/lspclientservermanager.cpp b/addons/lspclient/lspclientservermanager.cpp index 6ed18408a..6f12f667d 100644 --- a/addons/lspclient/lspclientservermanager.cpp +++ b/addons/lspclient/lspclientservermanager.cpp @@ -101,6 +101,21 @@ static QStringList indicationDataToStringList(const QJsonValue &indicationData) return {}; } +static LSPClientServer::TriggerCharactersOverride parseTriggerOverride(const QJsonValue &json) +{ + LSPClientServer::TriggerCharactersOverride adjust; + if (json.isObject()) { + auto ob = json.toObject(); + for (const auto &c : ob.value(QStringLiteral("exclude")).toString()) { + adjust.exclude.push_back(c); + } + for (const auto &c : ob.value(QStringLiteral("include")).toString()) { + adjust.include.push_back(c); + } + } + return adjust; +} + #include <memory> // helper guard to handle revision (un)lock @@ -807,8 +822,15 @@ private: } // spin up using currently configured client capabilities auto &caps = m_clientCapabilities; + // extract some more additional config + auto completionOverride = parseTriggerOverride(serverConfig.value(QStringLiteral("completionTriggerCharacters"))); + auto signatureOverride = parseTriggerOverride(serverConfig.value(QStringLiteral("signatureTriggerCharacters"))); // request server and setup - server.reset(new LSPClientServer(cmdline, root, realLangId, serverConfig.value(QStringLiteral("initializationOptions")), {folders, caps})); + server.reset(new LSPClientServer(cmdline, + root, + realLangId, + serverConfig.value(QStringLiteral("initializationOptions")), + {folders, caps, completionOverride, signatureOverride})); connect(server.data(), &LSPClientServer::stateChanged, this, &self_type::onStateChanged, Qt::UniqueConnection); if (!server->start(m_plugin->m_debugMode)) { QString message = i18n("Failed to start server: %1", cmdline.join(QLatin1Char(' '))); diff --git a/doc/kate/plugins.docbook b/doc/kate/plugins.docbook index 520ff3cfb..177d5237f 100644 --- a/doc/kate/plugins.docbook +++ b/doc/kate/plugins.docbook @@ -2671,6 +2671,10 @@ entry object may also have an "initializationOptions" entry, which is passed along to the server as part of the 'initialize' method. If present, a "settings" entry is passed to the server by means of the 'workspace/didChangeConfiguration' notification. +Either of "completionTriggerCharacters" or "signatureTriggerCharacters" may be +specified as a JSON object with string members "exclude" and/or "include". +These will be used to respectively exclude or add some characters to +the respective trigger set as provided by the server. </para> <para>
