aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/customparserconfigdialog.cpp
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2013-08-05 21:30:41 +0300
committerAndré Hartmann <aha_1980@gmx.de>2013-08-08 11:50:08 +0200
commit4bc61ecac4701a0e4f4fa5c7e48986dcd687c11a (patch)
tree469d32aaa36072d9878c9669bb243e2c20b4e03c /src/plugins/projectexplorer/customparserconfigdialog.cpp
parent9249175a4baf7dbc355fd14c1aa8dc74280eeeb8 (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.cpp167
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;
+}