Skip to content

Commit

Permalink
CargoOutputDetector: detect build errors on rust projects
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
diegoiast committed Jan 24, 2025
1 parent 4a0c856 commit 2c1a892
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 9 deletions.
27 changes: 23 additions & 4 deletions src/plugins/ProjectManager/CompilerOutputDecoders.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<CompileStatus> foundStatus() = 0;
Expand All @@ -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<CompileStatus> foundStatus() override;
virtual void endOfOutput() override;

Expand All @@ -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<CompileStatus> foundStatus() override;
virtual void endOfOutput() override;

Expand All @@ -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<CompileStatus> foundStatus();
void endOfOutput();

public:
QList<CompileStatus> compileStatuses;
};

class CargoOutputDetector : public OutputDetector {
public:
CargoOutputDetector() = default;
~CargoOutputDetector() override = default;

void processLine(const QString &line, const QString &sourceDir) override;
QList<CompileStatus> 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<CompileStatus> m_compileStatuses;
CompileStatus currentStatus = {};
QString accumulatedMessage;
};
5 changes: 3 additions & 2 deletions src/plugins/ProjectManager/ProjectIssuesWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ ProjectIssuesWidget::ProjectIssuesWidget(PluginManager *parent)

outputDetector.add(new ClOutputDetector);
outputDetector.add(new GccOutputDetector);
outputDetector.add(new CargoOutputDetector);
}

ProjectIssuesWidget::~ProjectIssuesWidget() { delete ui; }
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/ProjectManager/ProjectIssuesWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/ProjectManager/ProjectManagerPlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<ProjectBuildConfig> buildConfig) -> void {
Expand Down

0 comments on commit 2c1a892

Please sign in to comment.