From ec433d1a70c7ec07a2ce304bdb5ca60540b02c9d Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Mon, 26 May 2025 03:25:42 -0700 Subject: [PATCH] core: improve log format for QML errors and warnings --- src/core/generation.cpp | 25 +++++++++++++++++++++++++ src/core/generation.hpp | 3 +++ src/core/rootwrapper.cpp | 24 ++++++++++++++++-------- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/core/generation.cpp b/src/core/generation.cpp index 49451f4a..28fa977b 100644 --- a/src/core/generation.cpp +++ b/src/core/generation.cpp @@ -8,11 +8,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -24,6 +26,10 @@ #include "reload.hpp" #include "scan.hpp" +namespace { +Q_LOGGING_CATEGORY(logScene, "scene"); +} + static QHash g_generations; // NOLINT EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner) @@ -34,6 +40,9 @@ EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner) , engine(new QQmlEngine()) { g_generations.insert(this->engine, this); + this->engine->setOutputWarningsToStandardError(false); + QObject::connect(this->engine, &QQmlEngine::warnings, this, &EngineGeneration::onEngineWarnings); + this->engine->addUrlInterceptor(&this->urlInterceptor); this->engine->setNetworkAccessManagerFactory(&this->interceptNetFactory); this->engine->setIncubationController(&this->delayedIncubationController); @@ -312,6 +321,22 @@ void EngineGeneration::incubationControllerDestroyed() { } } +void EngineGeneration::onEngineWarnings(const QList& warnings) const { + for (const auto& error: warnings) { + auto rel = "**/" % this->rootPath.relativeFilePath(error.url().path()); + + QString objectName; + auto desc = error.description(); + if (auto i = desc.indexOf(": "); i != -1) { + objectName = desc.first(i); + desc = desc.sliced(i + 2); + } + + qCWarning(logScene).noquote().nospace() << objectName << " at " << rel << '[' << error.line() + << ':' << error.column() << "]: " << desc; + } +} + void EngineGeneration::registerExtension(const void* key, EngineGenerationExt* extension) { if (this->extensions.contains(key)) { delete this->extensions.value(key); diff --git a/src/core/generation.hpp b/src/core/generation.hpp index b033cebc..df2c85a4 100644 --- a/src/core/generation.hpp +++ b/src/core/generation.hpp @@ -4,8 +4,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -82,6 +84,7 @@ private slots: void onFileChanged(const QString& name); void onDirectoryChanged(); void incubationControllerDestroyed(); + void onEngineWarnings(const QList& warnings) const; private: void postReload(); diff --git a/src/core/rootwrapper.cpp b/src/core/rootwrapper.cpp index 0656b558..b51b4034 100644 --- a/src/core/rootwrapper.cpp +++ b/src/core/rootwrapper.cpp @@ -16,7 +16,6 @@ #include "../window/floatingwindow.hpp" #include "generation.hpp" #include "instanceinfo.hpp" -#include "logging.hpp" #include "qmlglobal.hpp" #include "scan.hpp" @@ -32,7 +31,6 @@ RootWrapper::RootWrapper(QString rootPath, QString shellId) this->reloadGraph(true); if (this->generation == nullptr) { - qCritical() << "could not create scene graph, exiting"; exit(-1); // NOLINT } } @@ -54,6 +52,7 @@ void RootWrapper::reloadGraph(bool hard) { // todo: move into EngineGeneration if (this->generation != nullptr) { + qInfo() << "Reloading configuration..."; QuickshellSettings::reset(); } @@ -65,9 +64,17 @@ void RootWrapper::reloadGraph(bool hard) { auto component = QQmlComponent(generation->engine, url); if (!component.isReady()) { - qCritical() << "Failed to load configuration:"; - auto error = component.errorString().trimmed(); - qCCritical(logBare).noquote() << error; + qCritical() << "Failed to load configuration"; + QString errorString = "Failed to load configuration"; + + auto errors = component.errors(); + for (auto& error: errors) { + auto rel = "**/" % rootPath.relativeFilePath(error.url().path()); + auto msg = " caused by " % rel % '[' % QString::number(error.line()) % ':' + % QString::number(error.column()) % "]: " % error.description(); + errorString += '\n' % msg; + qCritical().noquote() << msg; + } auto newFiles = generation->scanner.scannedFiles; generation->destroy(); @@ -80,15 +87,16 @@ void RootWrapper::reloadGraph(bool hard) { auto showPopup = true; if (this->generation->qsgInstance != nullptr) { this->generation->qsgInstance->clearReloadPopupInhibit(); - emit this->generation->qsgInstance->reloadFailed(error); + emit this->generation->qsgInstance->reloadFailed(errorString); showPopup = !this->generation->qsgInstance->isReloadPopupInhibited(); } - if (showPopup) qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, error); + if (showPopup) + qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, errorString); } if (this->generation != nullptr && this->generation->qsgInstance != nullptr) { - emit this->generation->qsgInstance->reloadFailed(error); + emit this->generation->qsgInstance->reloadFailed(errorString); } return;