From 2dd17218e302a04e889e019ec62f3f795c903f2b Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 18 Sep 2024 08:23:40 +0200 Subject: [PATCH] Lua: Add "id" to ScriptPluginSpec Change-Id: Iabc766e511bc07bc3379aa13aed0aec04b3584e8 Reviewed-by: Alessandro Portale --- src/plugins/lua/luaengine.cpp | 54 ++++++++++++++++++++++------------- src/plugins/lua/luaengine.h | 8 ++++++ 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/plugins/lua/luaengine.cpp b/src/plugins/lua/luaengine.cpp index 5e798d8051b..a13c0fd8474 100644 --- a/src/plugins/lua/luaengine.cpp +++ b/src/plugins/lua/luaengine.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -56,6 +57,31 @@ public: QTemporaryDir appDataDir; }; +QObject *ScriptPluginSpec::setup( + sol::state_view lua, + const QString &id, + const QString &name, + const Utils::FilePath appDataPath, + const Utils::FilePath pluginLocation) +{ + lua.new_usertype( + "PluginSpec", + sol::no_constructor, + "id", + sol::property([](ScriptPluginSpec &self) { return self.id; }), + "name", + sol::property([](ScriptPluginSpec &self) { return self.name; }), + "pluginDirectory", + sol::property([pluginLocation]() { return pluginLocation; })); + + auto guardObject = std::make_unique(); + auto guardObjectPtr = guardObject.get(); + + lua["PluginSpec"] = ScriptPluginSpec{id, name, appDataPath, std::move(guardObject)}; + + return guardObjectPtr; +} + void prepareLuaState( sol::state &lua, const QString &name, @@ -85,13 +111,11 @@ void prepareLuaState( Core::MessageManager::writeSilently(QString("%1 %2").arg(p, msg)); } }; - - lua.new_usertype( - "PluginSpec", sol::no_constructor, "name", sol::property([](ScriptPluginSpec &self) { - return self.name; - })); - - lua["PluginSpec"] = ScriptPluginSpec{name, appDataPath, std::make_unique()}; + const expected_str tmpDir = HostOsInfo::root().tmpDir(); + QTC_ASSERT_EXPECTED(tmpDir, return); + QString id = name; + id = id.replace(QRegularExpression("[^a-zA-Z0-9_]"), "_").toLower(); + ScriptPluginSpec::setup(lua, id, name, appDataPath, *tmpDir); for (const auto &[name, func] : d->m_providers.asKeyValueRange()) { lua["package"]["preload"][name.toStdString()] = [func = func](const sol::this_state &s) { @@ -247,18 +271,8 @@ expected_str prepareSetup( const FilePath appDataPath = Core::ICore::userResourcePath() / "plugin-data" / "lua" / pluginSpec.location().fileName(); - lua.new_usertype( - "PluginSpec", - sol::no_constructor, - "name", - sol::property([](ScriptPluginSpec &self) { return self.name; }), - "pluginDirectory", - sol::property([p = pluginSpec.location()]() { return p; })); - - auto guardObject = std::make_unique(); - auto guardObjectPtr = guardObject.get(); - - lua["PluginSpec"] = ScriptPluginSpec{pluginSpec.name(), appDataPath, std::move(guardObject)}; + QObject *guard = ScriptPluginSpec::setup( + lua, pluginSpec.id(), pluginSpec.name(), appDataPath, pluginSpec.location()); // TODO: only register what the plugin requested for (const auto &[name, func] : d->m_providers.asKeyValueRange()) { @@ -291,7 +305,7 @@ expected_str prepareSetup( qCDebug(logLuaEngine) << "Hooks table found: " << hookTable.has_value(); if (hookTable) { - auto connectResult = connectHooks(lua, *hookTable, {}, guardObjectPtr); + auto connectResult = connectHooks(lua, *hookTable, {}, guard); if (!connectResult) return make_unexpected(connectResult.error()); } diff --git a/src/plugins/lua/luaengine.h b/src/plugins/lua/luaengine.h index 22dad891fdb..81efef952e3 100644 --- a/src/plugins/lua/luaengine.h +++ b/src/plugins/lua/luaengine.h @@ -31,6 +31,14 @@ struct CoroutineState struct ScriptPluginSpec { + static QObject *setup( + sol::state_view lua, + const QString &id, + const QString &name, + const Utils::FilePath appDataPath, + const Utils::FilePath pluginLocation); + + QString id; QString name; Utils::FilePath appDataPath; std::unique_ptr connectionGuard;