diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2013-08-05 21:30:41 +0300 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2013-08-08 11:50:08 +0200 |
commit | 4bc61ecac4701a0e4f4fa5c7e48986dcd687c11a (patch) | |
tree | 469d32aaa36072d9878c9669bb243e2c20b4e03c /src/plugins/projectexplorer/customparserconfigdialog.cpp | |
parent | 9249175a4baf7dbc355fd14c1aa8dc74280eeeb8 (diff) |
Custom Error Parser
Allow setting the following items from outside:
* capture regular expression,
* file name, line number and message capture position and
* whether to parse stdout, stderr or both
The parser functions can be unit-tested by running (Debug build of Qt
Creator needed):
qtcreator -test ProjectExplorer,testCustomOutputParsers
The data is passed to the custom parser in
CustomToolChain::outputParser().
The parser information is stored in toolchains.xml together with the
custom toolchain. A configuration widget is provided to set up and test
the regular expression against a sample error message.
Change-Id: I6191df3c44432943e0aeb16c48d8e79d35845d2e
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Diffstat (limited to 'src/plugins/projectexplorer/customparserconfigdialog.cpp')
-rw-r--r-- | src/plugins/projectexplorer/customparserconfigdialog.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/plugins/projectexplorer/customparserconfigdialog.cpp b/src/plugins/projectexplorer/customparserconfigdialog.cpp new file mode 100644 index 00000000000..c236abe1a54 --- /dev/null +++ b/src/plugins/projectexplorer/customparserconfigdialog.cpp @@ -0,0 +1,167 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Andre Hartmann. +** Contact: aha_1980@gmx.de +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "customparserconfigdialog.h" +#include "ui_customparserconfigdialog.h" + +#include <QPushButton> +#include <QRegExp> + +CustomParserConfigDialog::CustomParserConfigDialog(QDialog *parent) : + QDialog(parent), + ui(new Ui::CustomParserConfigDialog) +{ + ui->setupUi(this); + + connect(ui->errorPattern, SIGNAL(textChanged(QString)), this, SLOT(changed())); + connect(ui->errorMessage, SIGNAL(textChanged(QString)), this, SLOT(changed())); + connect(ui->fileNameCap, SIGNAL(valueChanged(int)), this, SLOT(changed())); + connect(ui->lineNumberCap, SIGNAL(valueChanged(int)), this, SLOT(changed())); + connect(ui->messageCap, SIGNAL(valueChanged(int)), this, SLOT(changed())); + + changed(); + m_dirty = false; +} + +CustomParserConfigDialog::~CustomParserConfigDialog() +{ + delete ui; +} + +void CustomParserConfigDialog::setExampleSettings() +{ + setErrorPattern(QLatin1String("#error (.*):(\\d+): (.*)$")); + setFileNameCap(1); + setLineNumberCap(2); + setMessageCap(3); + ui->errorMessage->setText(QLatin1String("#error /home/user/src/test.c:891: Unknown identifier `test`")); +} + +void CustomParserConfigDialog::setSettings(const ProjectExplorer::CustomParserSettings &settings) +{ + if (settings.errorPattern.isEmpty()) { + setExampleSettings(); + return; + } + + setErrorPattern(settings.errorPattern); + setFileNameCap(settings.fileNameCap); + setLineNumberCap(settings.lineNumberCap); + setMessageCap(settings.messageCap); +} + +ProjectExplorer::CustomParserSettings CustomParserConfigDialog::settings() const +{ + ProjectExplorer::CustomParserSettings result; + result.errorPattern = errorPattern(); + result.fileNameCap = fileNameCap(); + result.lineNumberCap = lineNumberCap(); + result.messageCap = messageCap(); + return result; +} + +void CustomParserConfigDialog::setErrorPattern(const QString &errorPattern) +{ + ui->errorPattern->setText(errorPattern); +} + +QString CustomParserConfigDialog::errorPattern() const +{ + return ui->errorPattern->text(); +} + +void CustomParserConfigDialog::setFileNameCap(int fileNameCap) +{ + ui->fileNameCap->setValue(fileNameCap); +} + +int CustomParserConfigDialog::fileNameCap() const +{ + return ui->fileNameCap->value(); +} + +void CustomParserConfigDialog::setLineNumberCap(int lineNumberCap) +{ + ui->lineNumberCap->setValue(lineNumberCap); +} + +int CustomParserConfigDialog::lineNumberCap() const +{ + return ui->lineNumberCap->value(); +} + +void CustomParserConfigDialog::setMessageCap(int messageCap) +{ + ui->messageCap->setValue(messageCap); +} + +int CustomParserConfigDialog::messageCap() const +{ + return ui->messageCap->value(); +} + +bool CustomParserConfigDialog::isDirty() const +{ + return m_dirty; +} + +void CustomParserConfigDialog::changed() +{ + QRegExp rx; + rx.setPattern(ui->errorPattern->text()); + rx.setMinimal(true); + + QPalette palette; + palette.setColor(QPalette::Text, rx.isValid() ? Qt::black : Qt::red); + ui->errorPattern->setPalette(palette); + ui->errorPattern->setToolTip(rx.isValid() ? QString() : rx.errorString()); + + int pos = rx.indexIn(ui->errorMessage->text()); + if (rx.isEmpty() || !rx.isValid() || pos < 0) { + QString error = QLatin1String("<font color=\"red\">") + tr("Not applicable: "); + if (rx.isEmpty()) + error += tr("Pattern is empty."); + else if (!rx.isValid()) + error += rx.errorString(); + else + error += tr("Pattern does not match the error message."); + + ui->fileNameTest->setText(error); + ui->lineNumberTest->setText(error); + ui->messageTest->setText(error); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + return; + } + + ui->fileNameTest->setText(rx.cap(ui->fileNameCap->value())); + ui->lineNumberTest->setText(rx.cap(ui->lineNumberCap->value())); + ui->messageTest->setText(rx.cap(ui->messageCap->value())); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + m_dirty = true; +} |