core: improve log format for QML errors and warnings

This commit is contained in:
outfoxxed 2025-05-26 03:25:42 -07:00
parent 4472b27039
commit ec433d1a70
Signed by untrusted user: outfoxxed
GPG key ID: 4C88A185FB89301E
3 changed files with 44 additions and 8 deletions

View file

@ -8,11 +8,13 @@
#include <qfileinfo.h>
#include <qfilesystemwatcher.h>
#include <qhash.h>
#include <qlist.h>
#include <qlogging.h>
#include <qloggingcategory.h>
#include <qobject.h>
#include <qqmlcontext.h>
#include <qqmlengine.h>
#include <qqmlerror.h>
#include <qqmlincubator.h>
#include <qtmetamacros.h>
@ -24,6 +26,10 @@
#include "reload.hpp"
#include "scan.hpp"
namespace {
Q_LOGGING_CATEGORY(logScene, "scene");
}
static QHash<const QQmlEngine*, EngineGeneration*> 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<QQmlError>& 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);