diff --git a/src/common/scriptmanager.cpp b/src/common/scriptmanager.cpp index e2894f81..0572112c 100755 --- a/src/common/scriptmanager.cpp +++ b/src/common/scriptmanager.cpp @@ -307,6 +307,10 @@ std::tuple ScriptManager::executeString(const QString &s) { Q_ASSERT(m_engine); + // Evaluating 's' via QQmlExpression would be straight forward, but this is problematic due + // to QTBUG-33514 (singletons are not available inside QQmlExpressions) and BrickStore relying + // heavily on singletons. + const char *script = "import BrickStore\n" "import BrickLink\n" @@ -315,20 +319,32 @@ std::tuple ScriptManager::executeString(const QString &s) " property var bl: BrickLink\n" " property var bs: BrickStore\n" " property string help: \"Use 'bl'/'bs' to access the BrickLink/BrickStore singletons\"\n" + " property var __result\n" + " property var __error\n" + " Component.onCompleted: {\n" + " try { __result = function() { return ${SCRIPT} }() }\n" + " catch (error) { __error = error }\n" + " }\n" "}\n"; QQmlComponent component(m_engine); - component.setData(script, QUrl()); - if (component.status() == QQmlComponent::Error) - return { u"JS compile error: "_qs + component.errorString(), false }; + component.setData(QByteArray(script).replace("${SCRIPT}", s.toUtf8()), QUrl()); + if (component.status() == QQmlComponent::Error) { + QStringList errorStrings; + const auto errors = component.errors(); + errorStrings.reserve(errors.size()); + for (const auto &e : errors) + errorStrings << e.description(); + return { u"JS compile error: "_qs + errorStrings.join(u", "_qs), false }; + } m_rootObject = component.create(); - QQmlExpression e(m_engine->rootContext(), m_rootObject, s); + QQmlExpression e(m_engine->rootContext(), m_rootObject, u"if (__error) throw __error; __result"_qs); bool isUndefined = false; auto result = e.evaluate(&isUndefined); if (e.hasError()) - return { e.error().toString(), false }; + return { e.error().description(), false }; else if (isUndefined) return { QString { }, true }; else diff --git a/src/desktop/developerconsole.cpp b/src/desktop/developerconsole.cpp index b0dfb9e0..d2e09725 100755 --- a/src/desktop/developerconsole.cpp +++ b/src/desktop/developerconsole.cpp @@ -74,7 +74,8 @@ DeveloperConsole::DeveloperConsole(const QString &prompt, m_history.removeAll(cmd); m_history.append(cmd); } else { - m_log->appendPlainText(u"ERROR: " + message); + m_log->appendHtml(uR"(ERROR: )" + + message + uR"()"); } m_log->moveCursor(QTextCursor::End); }