From c320f65d1cd58f86061c09cf5992603e26af5871 Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@digia.com>
Date: Tue, 2 Apr 2013 15:21:59 +0200
Subject: [PATCH] IOutputParser: Make sure to not cut too much output

Introduce a method to cut away whitespaces from the end of a string
and use it consistently. This avoids a chain of parsers to repeatedly
cut away the last character, assuming that will be the line-break.

Task-number: QTCREATORBUG-9032
Change-Id: I68261c10873535faf94c885c914cd00510ed75d8
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/projectexplorer/clangparser.cpp   |  8 +++-----
 src/plugins/projectexplorer/gccparser.cpp     |  4 ++--
 src/plugins/projectexplorer/gnumakeparser.cpp |  4 ++--
 src/plugins/projectexplorer/ioutputparser.cpp | 10 ++++++++++
 src/plugins/projectexplorer/ioutputparser.h   |  2 ++
 src/plugins/projectexplorer/ldparser.cpp      |  2 +-
 src/plugins/qt4projectmanager/qmakeparser.cpp |  2 +-
 src/plugins/qtsupport/qtparser.cpp            |  2 +-
 8 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/plugins/projectexplorer/clangparser.cpp b/src/plugins/projectexplorer/clangparser.cpp
index eab8e37d495..971697f222f 100644
--- a/src/plugins/projectexplorer/clangparser.cpp
+++ b/src/plugins/projectexplorer/clangparser.cpp
@@ -33,10 +33,8 @@
 
 using namespace ProjectExplorer;
 
-namespace {
-    // opt. drive letter + filename: (2 brackets)
-    const char * const FILE_PATTERN = "(<command line>|([A-Za-z]:)?[^:]+\\.[^:]+)";
-}
+// opt. drive letter + filename: (2 brackets)
+static const char * const FILE_PATTERN = "(<command line>|([A-Za-z]:)?[^:]+\\.[^:]+)";
 
 ClangParser::ClangParser() :
     m_commandRegExp(QLatin1String("^clang(\\+\\+)?: +(fatal +)?(warning|error|note): (.*)$")),
@@ -57,7 +55,7 @@ ClangParser::~ClangParser()
 
 void ClangParser::stdError(const QString &line)
 {
-    const QString lne = line.left(line.count() - 1);
+    const QString lne = rightTrimmed(line);
     if (m_summaryRegExp.indexIn(lne) > -1) {
         emitTask();
         m_expectSnippet = false;
diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp
index ca88c95410e..cf0350ccedf 100644
--- a/src/plugins/projectexplorer/gccparser.cpp
+++ b/src/plugins/projectexplorer/gccparser.cpp
@@ -62,7 +62,7 @@ GccParser::GccParser()
 
 void GccParser::stdError(const QString &line)
 {
-    QString lne = line.trimmed();
+    QString lne = rightTrimmed(line);
 
     // Blacklist some lines to not handle them:
     if (lne.startsWith(QLatin1String("TeamBuilder ")) ||
@@ -117,7 +117,7 @@ void GccParser::stdError(const QString &line)
         return;
     } else if (m_regExpIncluded.indexIn(lne) > -1) {
         emit addTask(Task(Task::Unknown,
-                          lne /* description */,
+                          lne.trimmed() /* description */,
                           Utils::FileName::fromUserInput(m_regExpIncluded.cap(1)) /* filename */,
                           m_regExpIncluded.cap(3).toInt() /* linenumber */,
                           Core::Id(Constants::TASK_CATEGORY_COMPILE)));
diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp
index c090de9c9ab..37ca5b380a7 100644
--- a/src/plugins/projectexplorer/gnumakeparser.cpp
+++ b/src/plugins/projectexplorer/gnumakeparser.cpp
@@ -69,7 +69,7 @@ bool GnuMakeParser::hasFatalErrors() const
 
 void GnuMakeParser::stdOutput(const QString &line)
 {
-    QString lne = line.trimmed();
+    const QString lne = rightTrimmed(line);
 
     if (m_makeDir.indexIn(lne) > -1) {
         if (m_makeDir.cap(7) == QLatin1String("Leaving"))
@@ -84,7 +84,7 @@ void GnuMakeParser::stdOutput(const QString &line)
 
 void GnuMakeParser::stdError(const QString &line)
 {
-    QString lne = line.trimmed();
+    const QString lne = rightTrimmed(line);
 
     if (m_makefileError.indexIn(lne) > -1) {
         ++m_fatalErrorCount;
diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp
index d21056e0596..b996a560fb2 100644
--- a/src/plugins/projectexplorer/ioutputparser.cpp
+++ b/src/plugins/projectexplorer/ioutputparser.cpp
@@ -191,4 +191,14 @@ void IOutputParser::setWorkingDirectory(const QString &workingDirectory)
         m_parser->setWorkingDirectory(workingDirectory);
 }
 
+QString IOutputParser::rightTrimmed(const QString &in)
+{
+    int pos = in.length();
+    for (; pos > 0; --pos) {
+        if (!in.at(pos - 1).isSpace())
+            break;
+    }
+    return in.mid(0, pos);
+}
+
 }
diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h
index f2b4bcf3f4d..53200c1be3f 100644
--- a/src/plugins/projectexplorer/ioutputparser.h
+++ b/src/plugins/projectexplorer/ioutputparser.h
@@ -60,6 +60,8 @@ public:
     // For GnuMakeParser
     virtual void setWorkingDirectory(const QString &workingDirectory);
 
+    static QString rightTrimmed(const QString &in);
+
 signals:
     void addOutput(const QString &string, ProjectExplorer::BuildStep::OutputFormat format);
     void addTask(const ProjectExplorer::Task &task);
diff --git a/src/plugins/projectexplorer/ldparser.cpp b/src/plugins/projectexplorer/ldparser.cpp
index 500c8d3237f..a75188e790e 100644
--- a/src/plugins/projectexplorer/ldparser.cpp
+++ b/src/plugins/projectexplorer/ldparser.cpp
@@ -57,7 +57,7 @@ LdParser::LdParser()
 
 void LdParser::stdError(const QString &line)
 {
-    QString lne = line.trimmed();
+    QString lne = rightTrimmed(line);
     if (lne.startsWith(QLatin1String("TeamBuilder "))
             || lne.startsWith(QLatin1String("distcc["))
             || lne.contains(QLatin1String("ar: creating "))) {
diff --git a/src/plugins/qt4projectmanager/qmakeparser.cpp b/src/plugins/qt4projectmanager/qmakeparser.cpp
index 37dfaf3557c..ba15f6ab239 100644
--- a/src/plugins/qt4projectmanager/qmakeparser.cpp
+++ b/src/plugins/qt4projectmanager/qmakeparser.cpp
@@ -44,7 +44,7 @@ QMakeParser::QMakeParser() : m_error(QLatin1String("^(.+):(\\d+):\\s(.+)$"))
 
 void QMakeParser::stdError(const QString &line)
 {
-    QString lne(line.trimmed());
+    QString lne = rightTrimmed(line);
     if (lne.startsWith(QLatin1String("Project ERROR:"))) {
         const QString description = lne.mid(15);
         emit addTask(Task(Task::Error,
diff --git a/src/plugins/qtsupport/qtparser.cpp b/src/plugins/qtsupport/qtparser.cpp
index 3a56dc21ec3..3e64cc4efc9 100644
--- a/src/plugins/qtsupport/qtparser.cpp
+++ b/src/plugins/qtsupport/qtparser.cpp
@@ -47,7 +47,7 @@ QtParser::QtParser() :
 
 void QtParser::stdError(const QString &line)
 {
-    QString lne(line.trimmed());
+    QString lne = rightTrimmed(line);
     if (m_mocRegExp.indexIn(lne) > -1) {
         bool ok;
         int lineno = m_mocRegExp.cap(3).toInt(&ok);
-- 
GitLab