aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lua/luaengine.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2025-01-09 11:26:18 +0100
committerEike Ziller <eike.ziller@qt.io>2025-01-09 11:26:18 +0100
commitf20ca5ffd012e3b7190c498ea7bfef3aae6731f3 (patch)
tree0874c1f5d4307c5799ecf9dcf6f4161d7ca1e355 /src/plugins/lua/luaengine.cpp
parente4d6cbcfa023e8ad5c71565af038fb3056328b4a (diff)
parentb33422525557b6d94b880c828c69ca436bb8cfc3 (diff)
Merge remote-tracking branch 'origin/15.0'
Conflicts: doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc src/plugins/projectexplorer/runcontrol.cpp src/plugins/qmljseditor/qmljseditorsettings.cpp Change-Id: I113e3c8cd02e4bb6cbcd98a98436e46b96124f13
Diffstat (limited to 'src/plugins/lua/luaengine.cpp')
-rw-r--r--src/plugins/lua/luaengine.cpp74
1 files changed, 60 insertions, 14 deletions
diff --git a/src/plugins/lua/luaengine.cpp b/src/plugins/lua/luaengine.cpp
index a641bfbd03b..5b6a24ab0fc 100644
--- a/src/plugins/lua/luaengine.cpp
+++ b/src/plugins/lua/luaengine.cpp
@@ -30,6 +30,32 @@ Utils::expected_str<void> connectHooks(
static Q_LOGGING_CATEGORY(logLuaEngine, "qtc.lua.engine", QtWarningMsg);
+QString luaToString(lua_State *state, int index)
+{
+ size_t l;
+ const char *s = luaL_tolstring(state, index, &l);
+ if (s == nullptr)
+ return {};
+
+ // Remove from stack what tolstring pushed onto it.
+ sol::stack::pop_n(state, 1);
+
+ return QString::fromUtf8(s, l);
+}
+
+template<typename T>
+QString refToString(const T &ref)
+{
+ if (ref.template is<QString>())
+ return ref.template as<QString>();
+
+ if (ref.template is<sol::table>())
+ return toJsonString(ref.template as<sol::table>());
+
+ auto pp = sol::stack::push_pop(ref);
+ return luaToString(ref.lua_state(), -1);
+}
+
class LuaInterfaceImpl final : public QObject, public LuaInterface
{
public:
@@ -205,18 +231,38 @@ expected_str<void> connectHooks(
qCDebug(logLuaEngine) << "connectHooks called with path: " << path;
for (const auto &[k, v] : table) {
- qCDebug(logLuaEngine) << "Processing key: " << k.as<QString>();
- if (v.get_type() == sol::type::table) {
- return connectHooks(
- lua, v.as<sol::table>(), QStringList{path, k.as<QString>()}.join("."), guard);
- } else if (v.get_type() == sol::type::function) {
- QString hookName = QStringList{path, k.as<QString>()}.join(".");
- qCDebug(logLuaEngine) << "Connecting function to hook: " << hookName;
- auto it = d->m_hooks.find(hookName);
- if (it == d->m_hooks.end())
- return make_unexpected(Tr::tr("No hook with the name \"%1\" found.").arg(hookName));
- else
- it.value()(v.as<sol::function>(), guard);
+ if (k.get_type() != sol::type::string)
+ return make_unexpected(
+ Tr::tr("Non-string key encountered in Lua table at path \"%1\"").arg(path));
+
+ const auto keyName = k.as<QString>();
+ const auto currentPath = QStringList{path, keyName}.join(".");
+ qCDebug(logLuaEngine) << "Processing path:" << currentPath;
+
+ switch (v.get_type()) {
+ case sol::type::table: {
+ auto result = connectHooks(lua, v.as<sol::table>(), currentPath, guard);
+ if (!result)
+ return result;
+ break;
+ }
+ case sol::type::function: {
+ qCDebug(logLuaEngine) << "Connecting function to hook:" << currentPath;
+
+ auto it = d->m_hooks.find(currentPath);
+ if (it == d->m_hooks.end()) {
+ return make_unexpected(
+ Tr::tr("No hook with the name \"%1\" found.").arg(currentPath));
+ }
+
+ it.value()(v.as<sol::function>(), guard);
+ break;
+ }
+ default: {
+ return make_unexpected(Tr::tr("Unsupported value type \"%1\" at path \"%2\".")
+ .arg(static_cast<int>(v.get_type()))
+ .arg(currentPath));
+ }
}
}
@@ -316,8 +362,8 @@ expected_str<sol::protected_function> prepareSetup(
if (logLuaEngine().isDebugEnabled()) {
qCDebug(logLuaEngine) << "Script returned table with keys:";
for (const auto &[key, value] : *pluginTable) {
- qCDebug(logLuaEngine) << "Key:" << key.as<QString>();
- qCDebug(logLuaEngine) << "Value:" << value.as<QString>();
+ qCDebug(logLuaEngine) << "Key:" << refToString(key);
+ qCDebug(logLuaEngine) << "Value:" << refToString(value);
}
}