Skip to content

Commit ec433d1

Browse files
committed
core: improve log format for QML errors and warnings
1 parent 4472b27 commit ec433d1

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

src/core/generation.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
#include <qfileinfo.h>
99
#include <qfilesystemwatcher.h>
1010
#include <qhash.h>
11+
#include <qlist.h>
1112
#include <qlogging.h>
1213
#include <qloggingcategory.h>
1314
#include <qobject.h>
1415
#include <qqmlcontext.h>
1516
#include <qqmlengine.h>
17+
#include <qqmlerror.h>
1618
#include <qqmlincubator.h>
1719
#include <qtmetamacros.h>
1820

@@ -24,6 +26,10 @@
2426
#include "reload.hpp"
2527
#include "scan.hpp"
2628

29+
namespace {
30+
Q_LOGGING_CATEGORY(logScene, "scene");
31+
}
32+
2733
static QHash<const QQmlEngine*, EngineGeneration*> g_generations; // NOLINT
2834

2935
EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner)
@@ -34,6 +40,9 @@ EngineGeneration::EngineGeneration(const QDir& rootPath, QmlScanner scanner)
3440
, engine(new QQmlEngine()) {
3541
g_generations.insert(this->engine, this);
3642

43+
this->engine->setOutputWarningsToStandardError(false);
44+
QObject::connect(this->engine, &QQmlEngine::warnings, this, &EngineGeneration::onEngineWarnings);
45+
3746
this->engine->addUrlInterceptor(&this->urlInterceptor);
3847
this->engine->setNetworkAccessManagerFactory(&this->interceptNetFactory);
3948
this->engine->setIncubationController(&this->delayedIncubationController);
@@ -312,6 +321,22 @@ void EngineGeneration::incubationControllerDestroyed() {
312321
}
313322
}
314323

324+
void EngineGeneration::onEngineWarnings(const QList<QQmlError>& warnings) const {
325+
for (const auto& error: warnings) {
326+
auto rel = "**/" % this->rootPath.relativeFilePath(error.url().path());
327+
328+
QString objectName;
329+
auto desc = error.description();
330+
if (auto i = desc.indexOf(": "); i != -1) {
331+
objectName = desc.first(i);
332+
desc = desc.sliced(i + 2);
333+
}
334+
335+
qCWarning(logScene).noquote().nospace() << objectName << " at " << rel << '[' << error.line()
336+
<< ':' << error.column() << "]: " << desc;
337+
}
338+
}
339+
315340
void EngineGeneration::registerExtension(const void* key, EngineGenerationExt* extension) {
316341
if (this->extensions.contains(key)) {
317342
delete this->extensions.value(key);

src/core/generation.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
#include <qdir.h>
55
#include <qfilesystemwatcher.h>
66
#include <qhash.h>
7+
#include <qlist.h>
78
#include <qobject.h>
89
#include <qqmlengine.h>
10+
#include <qqmlerror.h>
911
#include <qqmlincubator.h>
1012
#include <qtclasshelpermacros.h>
1113

@@ -82,6 +84,7 @@ private slots:
8284
void onFileChanged(const QString& name);
8385
void onDirectoryChanged();
8486
void incubationControllerDestroyed();
87+
void onEngineWarnings(const QList<QQmlError>& warnings) const;
8588

8689
private:
8790
void postReload();

src/core/rootwrapper.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "../window/floatingwindow.hpp"
1717
#include "generation.hpp"
1818
#include "instanceinfo.hpp"
19-
#include "logging.hpp"
2019
#include "qmlglobal.hpp"
2120
#include "scan.hpp"
2221

@@ -32,7 +31,6 @@ RootWrapper::RootWrapper(QString rootPath, QString shellId)
3231
this->reloadGraph(true);
3332

3433
if (this->generation == nullptr) {
35-
qCritical() << "could not create scene graph, exiting";
3634
exit(-1); // NOLINT
3735
}
3836
}
@@ -54,6 +52,7 @@ void RootWrapper::reloadGraph(bool hard) {
5452

5553
// todo: move into EngineGeneration
5654
if (this->generation != nullptr) {
55+
qInfo() << "Reloading configuration...";
5756
QuickshellSettings::reset();
5857
}
5958

@@ -65,9 +64,17 @@ void RootWrapper::reloadGraph(bool hard) {
6564
auto component = QQmlComponent(generation->engine, url);
6665

6766
if (!component.isReady()) {
68-
qCritical() << "Failed to load configuration:";
69-
auto error = component.errorString().trimmed();
70-
qCCritical(logBare).noquote() << error;
67+
qCritical() << "Failed to load configuration";
68+
QString errorString = "Failed to load configuration";
69+
70+
auto errors = component.errors();
71+
for (auto& error: errors) {
72+
auto rel = "**/" % rootPath.relativeFilePath(error.url().path());
73+
auto msg = " caused by " % rel % '[' % QString::number(error.line()) % ':'
74+
% QString::number(error.column()) % "]: " % error.description();
75+
errorString += '\n' % msg;
76+
qCritical().noquote() << msg;
77+
}
7178

7279
auto newFiles = generation->scanner.scannedFiles;
7380
generation->destroy();
@@ -80,15 +87,16 @@ void RootWrapper::reloadGraph(bool hard) {
8087
auto showPopup = true;
8188
if (this->generation->qsgInstance != nullptr) {
8289
this->generation->qsgInstance->clearReloadPopupInhibit();
83-
emit this->generation->qsgInstance->reloadFailed(error);
90+
emit this->generation->qsgInstance->reloadFailed(errorString);
8491
showPopup = !this->generation->qsgInstance->isReloadPopupInhibited();
8592
}
8693

87-
if (showPopup) qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, error);
94+
if (showPopup)
95+
qs::ui::ReloadPopup::spawnPopup(InstanceInfo::CURRENT.instanceId, true, errorString);
8896
}
8997

9098
if (this->generation != nullptr && this->generation->qsgInstance != nullptr) {
91-
emit this->generation->qsgInstance->reloadFailed(error);
99+
emit this->generation->qsgInstance->reloadFailed(errorString);
92100
}
93101

94102
return;

0 commit comments

Comments
 (0)