From 2c1a8926cb57474a7dbe03ef678d51be3787fe7b Mon Sep 17 00:00:00 2001 From: Diego Iastrubni Date: Sat, 25 Jan 2025 01:17:33 +0200 Subject: [PATCH] CargoOutputDetector: detect build errors on rust projects We can now detect build errors on cargo build. Still not ideal, as we have some false positives (the "Running kit ... from ..." is detected as an issue). --- .../ProjectManager/CompilerOutputDecoders.h | 27 ++++++++++++++++--- .../ProjectManager/ProjectIssuesWidget.cpp | 5 ++-- .../ProjectManager/ProjectIssuesWidget.h | 4 +-- .../ProjectManager/ProjectManagerPlg.cpp | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/plugins/ProjectManager/CompilerOutputDecoders.h b/src/plugins/ProjectManager/CompilerOutputDecoders.h index 9700eb5..43b3fae 100644 --- a/src/plugins/ProjectManager/CompilerOutputDecoders.h +++ b/src/plugins/ProjectManager/CompilerOutputDecoders.h @@ -17,7 +17,7 @@ class OutputDetector { public: virtual ~OutputDetector() = default; - virtual void processLine(const QString &line) = 0; + virtual void processLine(const QString &line, const QString &sourceDir) = 0; // Returns the collected compile status and resets the list virtual QList foundStatus() = 0; @@ -29,7 +29,7 @@ class GeneralDetector : public OutputDetector { public: GeneralDetector() = default; ~GeneralDetector() override; - virtual void processLine(const QString &line) override; + virtual void processLine(const QString &line, const QString &sourceDir) override; virtual QList foundStatus() override; virtual void endOfOutput() override; @@ -45,7 +45,7 @@ class GccOutputDetector : public OutputDetector { GccOutputDetector() = default; ~GccOutputDetector() override = default; - void processLine(const QString &line) override; + void processLine(const QString &lin, const QString &sourceDir) override; QList foundStatus() override; virtual void endOfOutput() override; @@ -60,10 +60,29 @@ class GccOutputDetector : public OutputDetector { class ClOutputDetector : public OutputDetector { public: - void processLine(const QString &line); + void processLine(const QString &line, const QString &sourceDir); QList foundStatus(); void endOfOutput(); public: QList compileStatuses; }; + +class CargoOutputDetector : public OutputDetector { + public: + CargoOutputDetector() = default; + ~CargoOutputDetector() override = default; + + void processLine(const QString &line, const QString &sourceDir) override; + QList foundStatus() override; + void endOfOutput() override; + + private: + // Rust/Cargo output pattern for errors and warnings + QRegularExpression regionPattern = QRegularExpression( + R"(^(?:error|warning)(?:\[([^\]]+)\])?: (.+)\n\s*-->\s*([^:]+):(\d+):(\d+))"); + + QList m_compileStatuses; + CompileStatus currentStatus = {}; + QString accumulatedMessage; +}; diff --git a/src/plugins/ProjectManager/ProjectIssuesWidget.cpp b/src/plugins/ProjectManager/ProjectIssuesWidget.cpp index 865e897..892f0fc 100644 --- a/src/plugins/ProjectManager/ProjectIssuesWidget.cpp +++ b/src/plugins/ProjectManager/ProjectIssuesWidget.cpp @@ -240,6 +240,7 @@ ProjectIssuesWidget::ProjectIssuesWidget(PluginManager *parent) outputDetector.add(new ClOutputDetector); outputDetector.add(new GccOutputDetector); + outputDetector.add(new CargoOutputDetector); } ProjectIssuesWidget::~ProjectIssuesWidget() { delete ui; } @@ -265,10 +266,10 @@ auto static setEditorStatus(qmdiEditor *editor, const CompileStatus &status) { } } -void ProjectIssuesWidget::processLine(const QString &rawLines) { +void ProjectIssuesWidget::processLine(const QString &rawLines, const QString &sourceDir) { auto lines = rawLines.split("\n"); for (auto const &line : lines) { - outputDetector.processLine(line); + outputDetector.processLine(line, sourceDir); auto items = outputDetector.foundStatus(); for (auto &item : items) { model->addItem(item); diff --git a/src/plugins/ProjectManager/ProjectIssuesWidget.h b/src/plugins/ProjectManager/ProjectIssuesWidget.h index 635685c..85ab875 100644 --- a/src/plugins/ProjectManager/ProjectIssuesWidget.h +++ b/src/plugins/ProjectManager/ProjectIssuesWidget.h @@ -58,8 +58,8 @@ class ProjectIssuesWidget : public QWidget { public: explicit ProjectIssuesWidget(PluginManager *parent = nullptr); ~ProjectIssuesWidget(); - - void processLine(const QString &line); + + void processLine(const QString &line, const QString &sourceDir); inline void clearAllIssues() { model->clearAll(); } protected: diff --git a/src/plugins/ProjectManager/ProjectManagerPlg.cpp b/src/plugins/ProjectManager/ProjectManagerPlg.cpp index 5d8dd97..1129c40 100644 --- a/src/plugins/ProjectManager/ProjectManagerPlg.cpp +++ b/src/plugins/ProjectManager/ProjectManagerPlg.cpp @@ -776,7 +776,7 @@ auto ProjectManagerPlugin::processBuildOutput(const QString &line) -> void { cursor.movePosition(QTextCursor::End); cursor.insertText(line); this->outputPanel->commandOuput->setTextCursor(cursor); - this->projectIssues->processLine(line); + this->projectIssues->processLine(line, this->getCurrentConfig()->sourceDir); } auto ProjectManagerPlugin::updateTasksUI(std::shared_ptr buildConfig) -> void {