From 90a99bb5126d5499a1df88e18b479664a253d94c Mon Sep 17 00:00:00 2001
From: Ulf Hermann <ulf.hermann@theqtcompany.com>
Date: Fri, 22 Jan 2016 12:00:23 +0100
Subject: [PATCH] QtSupport: Parse compile errors from qscxmlc

Change-Id: I2dd5051b34bb10be61ee3de8a85a244e7d5dbbe4
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
---
 src/plugins/qtsupport/qscxmlcgenerator.cpp | 22 ++++++++++++++++++++++
 src/plugins/qtsupport/qscxmlcgenerator.h   |  1 +
 2 files changed, 23 insertions(+)

diff --git a/src/plugins/qtsupport/qscxmlcgenerator.cpp b/src/plugins/qtsupport/qscxmlcgenerator.cpp
index 7d2d58a6f04..69bc88957ff 100644
--- a/src/plugins/qtsupport/qscxmlcgenerator.cpp
+++ b/src/plugins/qtsupport/qscxmlcgenerator.cpp
@@ -37,6 +37,7 @@
 namespace QtSupport {
 
 static QLoggingCategory log("qtc.qsxmlcgenerator");
+static const char TaskCategory[] = "Task.Category.ExtraCompiler.QScxmlc";
 
 QScxmlcGenerator::QScxmlcGenerator(const ProjectExplorer::Project *project,
                                    const Utils::FileName &source,
@@ -47,8 +48,29 @@ QScxmlcGenerator::QScxmlcGenerator(const ProjectExplorer::Project *project,
             this, &QScxmlcGenerator::finishProcess);
 }
 
+void QScxmlcGenerator::parseIssues(const QByteArray &stderr)
+{
+    QList<ProjectExplorer::Task> issues;
+    foreach (const QByteArray &line, stderr.split('\n')) {
+        QByteArrayList tokens = line.split(':');
+
+        if (tokens.length() > 4) {
+            Utils::FileName file = Utils::FileName::fromUtf8(tokens[0]);
+            int line = tokens[1].toInt();
+            // int column = tokens[2].toInt(); <- nice, but not needed for now.
+            ProjectExplorer::Task::TaskType type = tokens[3].trimmed() == "error" ?
+                        ProjectExplorer::Task::Error : ProjectExplorer::Task::Warning;
+            QString message = QString::fromUtf8(tokens.mid(4).join(':').trimmed());
+            issues.append(ProjectExplorer::Task(type, message, file, line, TaskCategory));
+        }
+    }
+    setCompileIssues(issues);
+}
+
 void QScxmlcGenerator::finishProcess()
 {
+    parseIssues(m_process.readAllStandardError());
+
     setCompileTime(QDateTime::currentDateTime());
     foreach (const Utils::FileName &target, targets()) {
         QFile generated(m_tmpdir.path() + QLatin1Char('/') + target.fileName());
diff --git a/src/plugins/qtsupport/qscxmlcgenerator.h b/src/plugins/qtsupport/qscxmlcgenerator.h
index 88a7c63b265..f5a4c922774 100644
--- a/src/plugins/qtsupport/qscxmlcgenerator.h
+++ b/src/plugins/qtsupport/qscxmlcgenerator.h
@@ -46,6 +46,7 @@ private:
 
     QProcess m_process;
     QTemporaryDir m_tmpdir;
+    void parseIssues(const QByteArray &stderr);
 };
 
 class QScxmlcGeneratorFactory : public ProjectExplorer::ExtraCompilerFactory
-- 
GitLab