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