aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient/lualanguageclient
diff options
context:
space:
mode:
authorMarcus Tillmanns <[email protected]>2024-09-26 12:52:11 +0200
committerMarcus Tillmanns <[email protected]>2024-10-08 07:17:41 +0000
commite03aa820b43e7ca400f64c83977dfd9bf01354b6 (patch)
tree83b65c9842bf11ef2f4067ee7245d2a235aec1de /src/plugins/languageclient/lualanguageclient
parentd055fb2a0658da46e50456a03165e96ce6b27109 (diff)
Lua LSP: Add parameter for async options
Allows using async code to create the options of a language client. This is useful for instance if you need to get values from a SecrectAspect Change-Id: Ica23b7f0df00bff3af7520524905a59ceb5b8e8c Reviewed-by: David Schulz <[email protected]>
Diffstat (limited to 'src/plugins/languageclient/lualanguageclient')
-rw-r--r--src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
index 82f4a091dc2..ebc1e522fad 100644
--- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
+++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
@@ -11,6 +11,8 @@
#include <lua/bindings/inheritance.h>
#include <lua/luaengine.h>
+#include <lua/bindings/async.h>
+
#include <extensionsystem/iplugin.h>
#include <extensionsystem/pluginmanager.h>
@@ -18,6 +20,7 @@
#include <projectexplorer/projectmanager.h>
#include <utils/commandline.h>
+#include <utils/guardedcallback.h>
#include <utils/layoutbuilder.h>
#include <QJsonDocument>
@@ -207,6 +210,8 @@ public:
TransportType m_transportType{TransportType::StdIO};
std::function<expected_str<void>(CommandLine &)> m_cmdLineCallback;
std::function<expected_str<void>(QString &)> m_initOptionsCallback;
+ sol::function m_asyncInitOptions;
+ bool m_isUpdatingAsyncOptions{false};
AspectContainer *m_aspects{nullptr};
QString m_name;
Utils::Id m_settingsTypeId;
@@ -324,6 +329,13 @@ public:
&LanguageClientManager::clientRemoved,
this,
&LuaClientWrapper::onClientRemoved);
+
+ if (auto asyncInit = options.get<sol::optional<sol::function>>(
+ "initializationOptionsAsync")) {
+ m_asyncInitOptions = *asyncInit;
+ QMetaObject::invokeMethod(
+ this, &LuaClientWrapper::updateAsyncOptions, Qt::QueuedConnection);
+ }
}
void onClientRemoved(Client *c, bool unexpected)
@@ -462,6 +474,25 @@ public:
clients.front()->sendMessage(request);
}
+ void updateAsyncOptions()
+ {
+ if (m_isUpdatingAsyncOptions)
+ return;
+ QTC_ASSERT(m_asyncInitOptions, return);
+ m_isUpdatingAsyncOptions = true;
+ std::function<void(sol::object)> cb = guardedCallback(this, [this](sol::object options) {
+ if (options.is<sol::table>())
+ m_initializationOptions = ::Lua::toJsonString(options.as<sol::table>());
+ else if (options.is<QString>())
+ m_initializationOptions = options.as<QString>();
+
+ emit optionsChanged();
+ m_isUpdatingAsyncOptions = false;
+ });
+
+ ::Lua::Async::start<sol::object>(m_asyncInitOptions, cb);
+ }
+
void updateOptions()
{
if (m_cmdLineCallback) {
@@ -479,6 +510,8 @@ public:
// optionsChanged() needs to be called for it as well, but only once per updateOptions()
emit optionsChanged();
}
+ if (m_asyncInitOptions)
+ updateAsyncOptions();
}
static CommandLine cmdFromTable(const sol::table &tbl)