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