diff --git a/src/plugins/lua/bindings/action.cpp b/src/plugins/lua/bindings/action.cpp index 93ae6f51883..015dd9b0688 100644 --- a/src/plugins/lua/bindings/action.cpp +++ b/src/plugins/lua/bindings/action.cpp @@ -24,7 +24,7 @@ void addActionModule() "CA_NonConfigurable", Core::Command::CA_NonConfigurable); - result["create"] = [](const std::string &actionId, sol::table options) { + result["create"] = [](const std::string &actionId, const sol::table &options) { Core::ActionBuilder b(nullptr, Id::fromString(QString::fromStdString(actionId))); for (const auto &[k, v] : options) { diff --git a/src/plugins/lua/bindings/fetch.cpp b/src/plugins/lua/bindings/fetch.cpp index 85809573501..f8ea05d2d4a 100644 --- a/src/plugins/lua/bindings/fetch.cpp +++ b/src/plugins/lua/bindings/fetch.cpp @@ -53,7 +53,7 @@ void addFetchModule() static QNetworkAccessManager networkAccessManager; - fetch["fetch_cb"] = [](sol::table options, sol::function callback, sol::this_state s) { + fetch["fetch_cb"] = [](const sol::table &options, const sol::function &callback, const sol::this_state &thisState) { auto url = options.get("url"); auto method = (options.get_or("method", "GET")).toLower(); @@ -77,7 +77,7 @@ void addFetchModule() throw std::runtime_error("Unknown method: " + method.toStdString()); if (convertToTable) { - QObject::connect(reply, &QNetworkReply::finished, reply, [reply, s, callback]() { + QObject::connect(reply, &QNetworkReply::finished, reply, [reply, thisState, callback]() { reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { @@ -93,11 +93,11 @@ void addFetchModule() return; } if (doc.isObject()) { - callback(LuaEngine::toTable(s, doc.object())); + callback(LuaEngine::toTable(thisState, doc.object())); } else if (doc.isArray()) { - callback(LuaEngine::toTable(s, doc.array())); + callback(LuaEngine::toTable(thisState, doc.array())); } else { - sol::state_view lua(s); + sol::state_view lua(thisState); callback(lua.create_table()); } }); diff --git a/src/plugins/lua/bindings/hook.cpp b/src/plugins/lua/bindings/hook.cpp index cb94e54582e..261e6fe115a 100644 --- a/src/plugins/lua/bindings/hook.cpp +++ b/src/plugins/lua/bindings/hook.cpp @@ -34,7 +34,7 @@ void addHookModule() "Hook", sol::no_constructor, "connect", - [](Hook *hook, sol::function func) -> QMetaObject::Connection { + [](Hook *hook, const sol::function &func) -> QMetaObject::Connection { QMetaObject::Connection con = QObject::connect(hook, &Hook::trigger, [func](sol::table args) { auto res = LuaEngine::void_safe_call(func, args); @@ -46,12 +46,12 @@ void addHookModule() [](Hook *, QMetaObject::Connection con) { QObject::disconnect(con); }); }); - LuaEngine::registerHook("editors.documentOpened", [](sol::function func) { + LuaEngine::registerHook("editors.documentOpened", [](const sol::function &func) { QObject::connect(Core::EditorManager::instance(), &Core::EditorManager::documentOpened, [func](Core::IDocument *document) { func(document); }); }); - LuaEngine::registerHook("editors.documentClosed", [](sol::function func) { + LuaEngine::registerHook("editors.documentClosed", [](const sol::function &func) { QObject::connect(Core::EditorManager::instance(), &Core::EditorManager::documentClosed, [func](Core::IDocument *document) { func(document); }); diff --git a/src/plugins/lua/bindings/layout.cpp b/src/plugins/lua/bindings/layout.cpp index 3d396161c7b..6225bce9f33 100644 --- a/src/plugins/lua/bindings/layout.cpp +++ b/src/plugins/lua/bindings/layout.cpp @@ -13,10 +13,10 @@ using namespace Utils; namespace Lua::Internal { -static void processChildren(LayoutItem *item, sol::table children) +static void processChildren(LayoutItem *item, const sol::table &children) { for (size_t i = 1; i <= children.size(); ++i) { - sol::object v = children[i]; + const sol::object v = children[i]; if (v.is()) { item->addItem(*v.as()); @@ -25,7 +25,7 @@ static void processChildren(LayoutItem *item, sol::table children) } else if (v.is()) { item->addItem(v.as()); } else if (v.is()) { - sol::function f = v.as(); + const sol::function f = v.as(); auto res = LuaEngine::safe_call(f); QTC_ASSERT_EXPECTED(res, continue); item->addItem(**res); @@ -37,7 +37,7 @@ static void processChildren(LayoutItem *item, sol::table children) } template -static std::unique_ptr construct(Args &&...args, sol::table children) +static std::unique_ptr construct(Args &&...args, const sol::table &children) { std::unique_ptr item(new T(std::forward(args)..., {})); @@ -157,13 +157,13 @@ void addLayoutModule() layout["fieldGrowthPolicy"] = &fieldGrowthPolicy; layout["id"] = &id; layout["setText"] = &setText; - layout["onClicked"] = [](sol::function f) { + layout["onClicked"] = [](const sol::function &f) { return onClicked([f]() { auto res = LuaEngine::void_safe_call(f); QTC_CHECK_EXPECTED(res); }); }; - layout["onTextChanged"] = [](sol::function f) { + layout["onTextChanged"] = [](const sol::function &f) { return onTextChanged([f](const QString &text) { auto res = LuaEngine::void_safe_call(f, text); QTC_CHECK_EXPECTED(res); diff --git a/src/plugins/lua/bindings/messagemanager.cpp b/src/plugins/lua/bindings/messagemanager.cpp index 4e284c0b50a..f6b8e874ad3 100644 --- a/src/plugins/lua/bindings/messagemanager.cpp +++ b/src/plugins/lua/bindings/messagemanager.cpp @@ -7,47 +7,19 @@ namespace Lua::Internal { -static QString variadicToString(sol::state_view lua, sol::variadic_args vargs) -{ - sol::function tostring = lua["tostring"]; - QStringList msg; - for (auto v : vargs) { - if (v.get_type() != sol::type::string) { - lua_getglobal(lua.lua_state(), "tostring"); - v.push(); - if (lua_pcall(lua.lua_state(), 1, 1, 0) != LUA_OK) { - msg.append(""); - continue; - } - if (lua_isstring(lua.lua_state(), -1) != 1) { - msg.append(""); - continue; - } - auto str = sol::stack::pop(lua.lua_state()); - msg.append(str); - } else { - msg.append(v.get()); - } - } - return msg.join(""); -} - void addMessageManagerModule() { LuaEngine::registerProvider("MessageManager", [](sol::state_view lua) -> sol::object { sol::table mm = lua.create_table(); - mm.set_function("writeFlashing", [](sol::variadic_args vargs, sol::this_state s) { - sol::state_view lua(s); - Core::MessageManager::writeFlashing(variadicToString(lua, vargs)); + mm.set_function("writeFlashing", [](const sol::variadic_args &vargs) { + Core::MessageManager::writeFlashing(LuaEngine::variadicToStringList(vargs).join("")); }); - mm.set_function("writeDisrupting", [](sol::variadic_args vargs, sol::this_state s) { - sol::state_view lua(s); - Core::MessageManager::writeDisrupting(variadicToString(lua, vargs)); + mm.set_function("writeDisrupting", [](const sol::variadic_args &vargs) { + Core::MessageManager::writeDisrupting(LuaEngine::variadicToStringList(vargs).join("")); }); - mm.set_function("writeSilently", [](sol::variadic_args vargs, sol::this_state s) { - sol::state_view lua(s); - Core::MessageManager::writeSilently(variadicToString(lua, vargs)); + mm.set_function("writeSilently", [](const sol::variadic_args &vargs) { + Core::MessageManager::writeSilently(LuaEngine::variadicToStringList(vargs).join("")); }); return mm; diff --git a/src/plugins/lua/bindings/qtcprocess.cpp b/src/plugins/lua/bindings/qtcprocess.cpp index f40f22f4156..3c6c7eef7ec 100644 --- a/src/plugins/lua/bindings/qtcprocess.cpp +++ b/src/plugins/lua/bindings/qtcprocess.cpp @@ -15,7 +15,7 @@ void addProcessModule() LuaEngine::registerProvider("__process", [](sol::state_view lua) -> sol::object { sol::table process = lua.create_table(); - process["runInTerminal_cb"] = [](const QString &cmdline, sol::function cb) { + process["runInTerminal_cb"] = [](const QString &cmdline, const sol::function &cb) { Process *p = new Process; p->setTerminalMode(TerminalMode::Run); p->setCommand(CommandLine::fromUserInput((cmdline))); diff --git a/src/plugins/lua/bindings/settings.cpp b/src/plugins/lua/bindings/settings.cpp index 9097987840d..b1c388605fc 100644 --- a/src/plugins/lua/bindings/settings.cpp +++ b/src/plugins/lua/bindings/settings.cpp @@ -27,7 +27,7 @@ public: return it->second; } - void dynamic_set(const std::string &key, sol::stack_object value) + void dynamic_set(const std::string &key, const sol::stack_object &value) { if (!value.is()) throw std::runtime_error("AspectContainer can only contain BaseAspect instances"); @@ -50,7 +50,7 @@ public: std::unordered_map m_entries; }; -std::unique_ptr aspectContainerCreate(sol::table options) +std::unique_ptr aspectContainerCreate(const sol::table &options) { auto container = std::make_unique(); @@ -224,7 +224,7 @@ void typedAspectCreate(BoolAspect *aspect, const std::string &key, const sol::ob template std::unique_ptr createAspectFromTable( - sol::table options, const std::function &f) + const sol::table &options, const std::function &f) { auto aspect = std::make_unique(); @@ -265,7 +265,9 @@ sol::usertype addTypedAspect(sol::table &lua, const QString &name) return lua.new_usertype( name, "create", - [](sol::table options) { return createAspectFromTable(options, &typedAspectCreate); }, + [](const sol::table &options) { + return createAspectFromTable(options, &typedAspectCreate); + }, sol::base_classes, sol::bases, BaseAspect>()); } @@ -315,7 +317,7 @@ void addSettingsModule() settings.new_usertype( "ToggleAspect", "create", - [](sol::table options) { + [](const sol::table &options) { return createAspectFromTable( options, [](ToggleAspect *aspect, const std::string &key, const sol::object &value) { @@ -363,7 +365,7 @@ void addSettingsModule() settings.new_usertype( "TriStateAspect", "create", - [](sol::table options) { + [](const sol::table &options) { return createAspectFromTable( options, [](TriStateAspect *aspect, const std::string &key, const sol::object &value) { @@ -376,10 +378,9 @@ void addSettingsModule() }); }, "value", - sol::property([](TriStateAspect *a) { return triStateToString(a->value()); }, - [](TriStateAspect *a, const QString &v) { - a->setValue(triStateFromString(v)); - }), + sol::property( + [](TriStateAspect *a) { return triStateToString(a->value()); }, + [](TriStateAspect *a, const QString &v) { a->setValue(triStateFromString(v)); }), "volatileValue", sol::property( [](TriStateAspect *a) { @@ -396,7 +397,7 @@ void addSettingsModule() settings.new_usertype( "TextDisplay", "create", - [](sol::table options) { + [](const sol::table &options) { return createAspectFromTable( options, [](TextDisplay *aspect, const std::string &key, const sol::object &value) { @@ -430,7 +431,7 @@ void addSettingsModule() settings.new_usertype( "AspectList", "create", - [](sol::table options) { + [](const sol::table &options) { return createAspectFromTable( options, [](AspectList *aspect, const std::string &key, const sol::object &value) { @@ -462,14 +463,14 @@ void addSettingsModule() "createAndAddItem", &AspectList::createAndAddItem, "foreach", - [](AspectList *a, sol::function clbk) { + [](AspectList *a, const sol::function &clbk) { a->forEachItem([clbk](std::shared_ptr item) { auto res = Lua::LuaEngine::void_safe_call(clbk, item); QTC_CHECK_EXPECTED(res); }); }, "enumerate", - [](AspectList *a, sol::function clbk) { + [](AspectList *a, const sol::function &clbk) { a->forEachItem([clbk](std::shared_ptr item, int idx) { auto res = Lua::LuaEngine::void_safe_call(clbk, item, idx); QTC_CHECK_EXPECTED(res); @@ -494,7 +495,7 @@ void addSettingsModule() } }; - settings.new_usertype("OptionsPage", "create", [](sol::table options) { + settings.new_usertype("OptionsPage", "create", [](const sol::table &options) { return std::make_unique(options); }); diff --git a/src/plugins/lua/bindings/utils.cpp b/src/plugins/lua/bindings/utils.cpp index 8609beb4f25..370fb53fed0 100644 --- a/src/plugins/lua/bindings/utils.cpp +++ b/src/plugins/lua/bindings/utils.cpp @@ -17,7 +17,7 @@ void addUtilsModule() LuaEngine::registerProvider("__utils", [](sol::state_view lua) -> sol::object { sol::table utils = lua.create_table(); - utils.set_function("waitms_cb", [](int ms, sol::function cb) { + utils.set_function("waitms_cb", [](int ms, const sol::function &cb) { QTimer *timer = new QTimer(); timer->setSingleShot(true); timer->setInterval(ms); @@ -73,7 +73,7 @@ return { "isExecutableFile", &FilePath::isExecutableFile, "dirEntries", - [](sol::this_state s, const FilePath &p, sol::table options) -> sol::table { + [](sol::this_state s, const FilePath &p, const sol::table &options) -> sol::table { sol::state_view lua(s); sol::table result = lua.create_table(); const QStringList nameFilters = options.get_or("nameFilters", {}); diff --git a/src/plugins/lua/luaengine.cpp b/src/plugins/lua/luaengine.cpp index b9c67c99565..38aac217daa 100644 --- a/src/plugins/lua/luaengine.cpp +++ b/src/plugins/lua/luaengine.cpp @@ -43,17 +43,18 @@ void LuaEngine::registerProvider(const QString &packageName, const PackageProvid instance().d->m_providers[packageName] = provider; } -void LuaEngine::autoRegister(std::function registerFunction) +void LuaEngine::autoRegister(const std::function ®isterFunction) { instance().d->m_autoProviders.append(registerFunction); } -void LuaEngine::registerHook(QString name, std::function hook) +void LuaEngine::registerHook(QString name, const std::function &hook) { instance().d->m_hooks.insert("." + name, hook); } -expected_str LuaEngine::connectHooks(sol::state_view lua, const sol::table &table, QString path) +expected_str LuaEngine::connectHooks( + sol::state_view lua, const sol::table &table, const QString &path) { for (const auto &[k, v] : table) { if (v.get_type() == sol::type::table) { @@ -100,21 +101,11 @@ expected_str LuaEngine::loadPlugin(const Utils::FilePath &path) sol::lib::io); lua["print"] = [prefix = path.fileName()](sol::variadic_args va) { - QStringList strings; - int n = va.size(); - int i; - for (i = 1; i <= n; i++) { - size_t l; - const char *s = luaL_tolstring(va.lua_state(), i, &l); - if (s != nullptr) - strings.append(QString::fromUtf8(s, l)); - } - - qDebug().noquote() << "[" << prefix << "]" << strings.join("\t"); + qDebug().noquote() << "[" << prefix << "]" << variadicToStringList(va).join("\t"); }; for (const auto &[name, func] : d->m_providers.asKeyValueRange()) { - lua["package"]["preload"][name.toStdString()] = [func = func](sol::this_state s) { + lua["package"]["preload"][name.toStdString()] = [func = func](const sol::this_state &s) { return func(s); }; } @@ -165,7 +156,7 @@ static void setFromJson(sol::table &t, KeyType k, const QJsonValue &v) t[k] = LuaEngine::toTable(t.lua_state(), v); } -sol::table LuaEngine::toTable(sol::state_view lua, const QJsonValue &v) +sol::table LuaEngine::toTable(const sol::state_view &lua, const QJsonValue &v) { sol::table table(lua, sol::create); @@ -186,9 +177,9 @@ sol::table LuaEngine::toTable(sol::state_view lua, const QJsonValue &v) return table; } -QJsonValue toJsonValue(sol::object object); +QJsonValue toJsonValue(const sol::object &object); -QJsonValue toJsonValue(sol::table table) +QJsonValue toJsonValue(const sol::table &table) { if (table.get>(1)) { // Is Array @@ -212,7 +203,7 @@ QJsonValue toJsonValue(sol::table table) return obj; } -QJsonValue toJsonValue(sol::object object) +QJsonValue toJsonValue(const sol::object &object) { switch (object.get_type()) { case sol::type::lua_nil: @@ -235,15 +226,19 @@ QJsonValue LuaEngine::toJson(const sol::table &table) return toJsonValue(table); } -expected_str LuaEngine::resumeImpl(sol::this_state s, int nArgs) +QStringList LuaEngine::variadicToStringList(const sol::variadic_args &vargs) { - int res; - auto success = lua_resume(s.lua_state(), nullptr, nArgs, &res); + QStringList strings; + int n = vargs.size(); + int i; + for (i = 1; i <= n; i++) { + size_t l; + const char *s = luaL_tolstring(vargs.lua_state(), i, &l); + if (s != nullptr) + strings.append(QString::fromUtf8(s, l)); + } - if (success == LUA_OK || success == LUA_YIELD) - return res; - - return make_unexpected((sol::stack::pop(s.lua_state()))); + return strings; } } // namespace Lua diff --git a/src/plugins/lua/luaengine.h b/src/plugins/lua/luaengine.h index 3246c7de19b..0ea78e0211a 100644 --- a/src/plugins/lua/luaengine.h +++ b/src/plugins/lua/luaengine.h @@ -43,27 +43,20 @@ public: Utils::expected_str loadPlugin(const Utils::FilePath &path); static void registerProvider(const QString &packageName, const PackageProvider &provider); - static void autoRegister(std::function registerFunction); - static void registerHook(QString name, std::function hookProvider); + static void autoRegister(const std::function ®isterFunction); + static void registerHook(QString name, const std::function &hookProvider); static Utils::expected_str connectHooks(sol::state_view lua, const sol::table &hookTable); static bool isCoroutine(lua_State *state); - static sol::table toTable(sol::state_view lua, const QJsonValue &v); + static sol::table toTable(const sol::state_view &lua, const QJsonValue &v); static QJsonValue toJson(const sol::table &t); - static Utils::expected_str resumeImpl(sol::this_state s, int nargs); - - template - static Utils::expected_str resume(sol::this_state s, Args &&...args) - { - sol::stack::push(s, std::forward(args)...); - return resumeImpl(s, sizeof...(Args)); - } + static QStringList variadicToStringList(const sol::variadic_args &vargs); template - static Utils::expected_str safe_call(sol::protected_function function, Args &&...args) + static Utils::expected_str safe_call(const sol::protected_function &function, Args &&...args) { sol::protected_function_result result = function(std::forward(args)...); if (!result.valid()) { @@ -78,7 +71,8 @@ public: } template - static Utils::expected_str void_safe_call(sol::protected_function function, Args &&...args) + static Utils::expected_str void_safe_call( + const sol::protected_function &function, Args &&...args) { sol::protected_function_result result = function(std::forward(args)...); if (!result.valid()) { @@ -90,7 +84,7 @@ public: protected: Utils::expected_str connectHooks( - sol::state_view lua, const sol::table &table, QString path); + sol::state_view lua, const sol::table &table, const QString &path); private: std::unique_ptr d; diff --git a/src/plugins/lua/luauibindings.cpp b/src/plugins/lua/luauibindings.cpp index 5649a40dfc5..3c99085bda1 100644 --- a/src/plugins/lua/luauibindings.cpp +++ b/src/plugins/lua/luauibindings.cpp @@ -12,7 +12,7 @@ namespace Lua::Internal { template -sol::object qobject_index_get(sol::this_state s, QObject *obj, const char *key) +sol::object qobject_index_get(const sol::this_state &s, QObject *obj, const char *key) { auto &metaObject = T::staticMetaObject; int iProp = metaObject.indexOfProperty(key);