forked from qt-creator/qt-creator
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 <david.schulz@qt.io>
This commit is contained in:
@@ -11,6 +11,8 @@
|
|||||||
#include <lua/bindings/inheritance.h>
|
#include <lua/bindings/inheritance.h>
|
||||||
#include <lua/luaengine.h>
|
#include <lua/luaengine.h>
|
||||||
|
|
||||||
|
#include <lua/bindings/async.h>
|
||||||
|
|
||||||
#include <extensionsystem/iplugin.h>
|
#include <extensionsystem/iplugin.h>
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
|
|
||||||
@@ -18,6 +20,7 @@
|
|||||||
#include <projectexplorer/projectmanager.h>
|
#include <projectexplorer/projectmanager.h>
|
||||||
|
|
||||||
#include <utils/commandline.h>
|
#include <utils/commandline.h>
|
||||||
|
#include <utils/guardedcallback.h>
|
||||||
#include <utils/layoutbuilder.h>
|
#include <utils/layoutbuilder.h>
|
||||||
|
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
@@ -207,6 +210,8 @@ public:
|
|||||||
TransportType m_transportType{TransportType::StdIO};
|
TransportType m_transportType{TransportType::StdIO};
|
||||||
std::function<expected_str<void>(CommandLine &)> m_cmdLineCallback;
|
std::function<expected_str<void>(CommandLine &)> m_cmdLineCallback;
|
||||||
std::function<expected_str<void>(QString &)> m_initOptionsCallback;
|
std::function<expected_str<void>(QString &)> m_initOptionsCallback;
|
||||||
|
sol::function m_asyncInitOptions;
|
||||||
|
bool m_isUpdatingAsyncOptions{false};
|
||||||
AspectContainer *m_aspects{nullptr};
|
AspectContainer *m_aspects{nullptr};
|
||||||
QString m_name;
|
QString m_name;
|
||||||
Utils::Id m_settingsTypeId;
|
Utils::Id m_settingsTypeId;
|
||||||
@@ -324,6 +329,13 @@ public:
|
|||||||
&LanguageClientManager::clientRemoved,
|
&LanguageClientManager::clientRemoved,
|
||||||
this,
|
this,
|
||||||
&LuaClientWrapper::onClientRemoved);
|
&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)
|
void onClientRemoved(Client *c, bool unexpected)
|
||||||
@@ -462,6 +474,25 @@ public:
|
|||||||
clients.front()->sendMessage(request);
|
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()
|
void updateOptions()
|
||||||
{
|
{
|
||||||
if (m_cmdLineCallback) {
|
if (m_cmdLineCallback) {
|
||||||
@@ -479,6 +510,8 @@ public:
|
|||||||
// optionsChanged() needs to be called for it as well, but only once per updateOptions()
|
// optionsChanged() needs to be called for it as well, but only once per updateOptions()
|
||||||
emit optionsChanged();
|
emit optionsChanged();
|
||||||
}
|
}
|
||||||
|
if (m_asyncInitOptions)
|
||||||
|
updateAsyncOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
static CommandLine cmdFromTable(const sol::table &tbl)
|
static CommandLine cmdFromTable(const sol::table &tbl)
|
||||||
|
@@ -11,6 +11,7 @@ local lsp = {}
|
|||||||
---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server.
|
---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server.
|
||||||
---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject"
|
---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject"
|
||||||
---@field initializationOptions? function|table|string The initialization options to pass to the language server, either a JSON string, a table, or a function that returns either.
|
---@field initializationOptions? function|table|string The initialization options to pass to the language server, either a JSON string, a table, or a function that returns either.
|
||||||
|
---@field initializationOptionsAsync? function A callback that will return the initialization options as a JSON String or a table. Inside the callback you can use Async functions.
|
||||||
---@field settings? AspectContainer The settings object to associate with the language server.
|
---@field settings? AspectContainer The settings object to associate with the language server.
|
||||||
---@field onStartFailed? function This callback is called when client failed to start.
|
---@field onStartFailed? function This callback is called when client failed to start.
|
||||||
---@field showInSettings? boolean Whether the client should show up in the general Language Server list.
|
---@field showInSettings? boolean Whether the client should show up in the general Language Server list.
|
||||||
|
Reference in New Issue
Block a user