From db0bf8f30e6e24b1cdc76703aa70c7a32bde659f Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Thu, 8 Apr 2010 11:33:12 +0200
Subject: [PATCH] Split GccParser into 2, one for ld parsing

To be reused in the intel linux icpc parser

Reviewed-By: hunger
---
 src/plugins/projectexplorer/gccparser.cpp     | 36 ++-----
 src/plugins/projectexplorer/gccparser.h       |  2 -
 src/plugins/projectexplorer/ldparser.cpp      | 93 +++++++++++++++++++
 src/plugins/projectexplorer/ldparser.h        | 55 +++++++++++
 .../projectexplorer/projectexplorer.pro       |  6 +-
 5 files changed, 158 insertions(+), 34 deletions(-)
 create mode 100644 src/plugins/projectexplorer/ldparser.cpp
 create mode 100644 src/plugins/projectexplorer/ldparser.h

diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp
index b63d80f6df2..6cfab503059 100644
--- a/src/plugins/projectexplorer/gccparser.cpp
+++ b/src/plugins/projectexplorer/gccparser.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "gccparser.h"
+#include "ldparser.h"
 #include "projectexplorerconstants.h"
 #include "taskwindow.h"
 
@@ -35,9 +36,8 @@ using namespace ProjectExplorer;
 
 namespace {
     // opt. drive letter + filename: (2 brackets)
-    const char * const FILE_PATTERN("^(([A-Za-z]:)?[^:]+\\.[^:]+):");
-    // line no. or elf segment + offset: (1 bracket)
-    const char * const POSITION_PATTERN("(\\d+|\\(\\.[a-zA-Z0-9]*.0x[a-fA-F0-9]+\\)):");
+    const char * const FILE_PATTERN = "^(([A-Za-z]:)?[^:]+\\.[^:]+):";
+    const char * const COMMAND_PATTERN = "^(.*[\\\\/])?([a-z0-9]+-[a-z0-9]+-[a-z0-9]+-)?(gcc|g\\+\\+)(-[0-9\\.]+)?(\\.exe)?: ";
 }
 
 GccParser::GccParser()
@@ -48,20 +48,16 @@ GccParser::GccParser()
     m_regExpIncluded.setPattern("^.*from\\s([^:]+):(\\d+)(,|:)$");
     m_regExpIncluded.setMinimal(true);
 
-    m_regExpLinker.setPattern(QString::fromLatin1(FILE_PATTERN) + '(' + QLatin1String(POSITION_PATTERN) + ")?\\s(.+)$");
-    m_regExpLinker.setMinimal(true);
-
     // treat ld (and gold) as part of gcc for simplicity
     // optional path with trailing slash
     // optional arm-linux-none-thingy
     // name of executable
     // optional trailing version number
     // optional .exe postfix
-    m_regExpGccNames.setPattern("^(.*[\\\\/])?([a-z0-9]+-[a-z0-9]+-[a-z0-9]+-)?(gcc|g\\+\\+|ld|gold)(-[0-9\\.]+)?(\\.exe)?: ");
+    m_regExpGccNames.setPattern(COMMAND_PATTERN);
     m_regExpGccNames.setMinimal(true);
 
-    m_regExpInFunction.setPattern("^In (static |member )*function ");
-    m_regExpInFunction.setMinimal(true);
+    appendOutputParser(new LdParser);
 }
 
 void GccParser::stdError(const QString &line)
@@ -76,8 +72,7 @@ void GccParser::stdError(const QString &line)
     }
 
     // Handle misc issues:
-    if (lne.startsWith(QLatin1String("collect2:")) ||
-        lne.startsWith(QLatin1String("ERROR:")) ||
+    if (lne.startsWith(QLatin1String("ERROR:")) ||
         lne == QLatin1String("* cpp failed")) {
         emit addTask(Task(Task::Error,
                           lne /* description */,
@@ -118,25 +113,6 @@ void GccParser::stdError(const QString &line)
         if (m_regExp.cap(5).startsWith(QChar('#')))
             task.description = m_regExp.cap(5) + task.description;
 
-        emit addTask(task);
-        return;
-    } else if (m_regExpLinker.indexIn(lne) > -1) {
-        bool ok;
-        int lineno = m_regExpLinker.cap(4).toInt(&ok);
-        if (!ok)
-            lineno = -1;
-        QString description = m_regExpLinker.cap(5);
-        Task task(Task::Error,
-                  description,
-                  m_regExpLinker.cap(1) /* filename */,
-                  lineno,
-                  Constants::TASK_CATEGORY_COMPILE);
-        if (m_regExpInFunction.indexIn(description) > -1 ||
-            description.startsWith(QLatin1String("At global scope")) ||
-            description.startsWith(QLatin1String("instantiated from ")) ||
-            description.startsWith(QLatin1String("In instantiation of ")))
-            task.type = Task::Unknown;
-
         emit addTask(task);
         return;
     } else if (m_regExpIncluded.indexIn(lne) > -1) {
diff --git a/src/plugins/projectexplorer/gccparser.h b/src/plugins/projectexplorer/gccparser.h
index ecae3d6d95b..56e45e5602c 100644
--- a/src/plugins/projectexplorer/gccparser.h
+++ b/src/plugins/projectexplorer/gccparser.h
@@ -47,9 +47,7 @@ public:
 private:
     QRegExp m_regExp;
     QRegExp m_regExpIncluded;
-    QRegExp m_regExpLinker;
     QRegExp m_regExpGccNames;
-    QRegExp m_regExpInFunction;
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/ldparser.cpp b/src/plugins/projectexplorer/ldparser.cpp
new file mode 100644
index 00000000000..2ab0e541035
--- /dev/null
+++ b/src/plugins/projectexplorer/ldparser.cpp
@@ -0,0 +1,93 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "ldparser.h"
+#include "projectexplorerconstants.h"
+#include "taskwindow.h"
+
+using namespace ProjectExplorer;
+
+namespace {
+    // opt. drive letter + filename: (2 brackets)
+    const char * const FILE_PATTERN = "^(([A-Za-z]:)?[^:]+\\.[^:]+):";
+    // line no. or elf segment + offset: (1 bracket)
+    const char * const POSITION_PATTERN = "(\\d+|\\(\\.[a-zA-Z0-9]*.0x[a-fA-F0-9]+\\)):";
+    const char * const COMMAND_PATTERN = "^(.*[\\\\/])?([a-z0-9]+-[a-z0-9]+-[a-z0-9]+-)?(ld|gold)(-[0-9\\.]+)?(\\.exe)?: ";
+}
+
+LdParser::LdParser()
+{
+    m_regExpLinker.setPattern(QString::fromLatin1(FILE_PATTERN) + '(' + QLatin1String(POSITION_PATTERN) + ")?\\s(.+)$");
+    m_regExpLinker.setMinimal(true);
+
+    m_regExpGccNames.setPattern(COMMAND_PATTERN);
+    m_regExpGccNames.setMinimal(true);
+
+    m_regExpInFunction.setPattern("^In (static |member )*function ");
+    m_regExpInFunction.setMinimal(true);
+}
+
+void LdParser::stdError(const QString &line)
+{
+    QString lne = line.trimmed();
+    if (lne.startsWith(QLatin1String("TeamBuilder ")) ||
+        lne.startsWith(QLatin1String("distcc["))) {
+        IOutputParser::stdError(line);
+        return;
+    }
+
+    if (lne.startsWith(QLatin1String("collect2:"))) {
+        emit addTask(Task(Task::Error,
+                          lne /* description */,
+                          QString() /* filename */,
+                          -1 /* linenumber */,
+                          Constants::TASK_CATEGORY_COMPILE));
+        return;
+    } else if (m_regExpLinker.indexIn(lne) > -1) {
+        bool ok;
+        int lineno = m_regExpLinker.cap(4).toInt(&ok);
+        if (!ok)
+            lineno = -1;
+        QString description = m_regExpLinker.cap(5);
+        Task task(Task::Error,
+                  description,
+                  m_regExpLinker.cap(1) /* filename */,
+                  lineno,
+                  Constants::TASK_CATEGORY_COMPILE);
+        if (m_regExpInFunction.indexIn(description) > -1 ||
+            description.startsWith(QLatin1String("At global scope")) ||
+            description.startsWith(QLatin1String("instantiated from ")) ||
+            description.startsWith(QLatin1String("In instantiation of ")))
+            task.type = Task::Unknown;
+
+        emit addTask(task);
+        return;
+    }
+    IOutputParser::stdError(line);
+}
diff --git a/src/plugins/projectexplorer/ldparser.h b/src/plugins/projectexplorer/ldparser.h
new file mode 100644
index 00000000000..66cdb6c443a
--- /dev/null
+++ b/src/plugins/projectexplorer/ldparser.h
@@ -0,0 +1,55 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef LDPARSER_H
+#define LDPARSER_H
+
+#include "ioutputparser.h"
+
+#include <QtCore/QRegExp>
+
+namespace ProjectExplorer {
+
+class LdParser : public ProjectExplorer::IOutputParser
+{
+    Q_OBJECT
+
+public:
+    LdParser();
+    virtual void stdError(const QString &line);
+
+private:
+    QRegExp m_regExpLinker;
+    QRegExp m_regExpGccNames;
+    QRegExp m_regExpInFunction;
+};
+
+} // namespace ProjectExplorer
+
+#endif // GCCPARSER_H
diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro
index 431893dddea..5c9a2084580 100644
--- a/src/plugins/projectexplorer/projectexplorer.pro
+++ b/src/plugins/projectexplorer/projectexplorer.pro
@@ -77,7 +77,8 @@ HEADERS += projectexplorer.h \
     doubletabwidget.h \
     addtargetdialog.h \
     buildenvironmentwidget.h \
-    buildconfigdialog.h
+    buildconfigdialog.h \
+    ldparser.h
 SOURCES += projectexplorer.cpp \
     projectwindow.cpp \
     buildmanager.cpp \
@@ -141,7 +142,8 @@ SOURCES += projectexplorer.cpp \
     doubletabwidget.cpp \
     addtargetdialog.cpp \
     buildenvironmentwidget.cpp \
-    buildconfigdialog.cpp
+    buildconfigdialog.cpp \
+    ldparser.cpp
 FORMS += processstep.ui \
     editorsettingspropertiespage.ui \
     runsettingspropertiespage.ui \
-- 
GitLab