CustomToolChain: Support choosing an error parser

Change-Id: Ida2223d6e3c6577d13aa52827c00e3fa3f44a848
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Orgad Shaneh
2013-08-05 21:21:49 +03:00
committed by Orgad Shaneh
parent 208aeb79ed
commit debfc1718f
2 changed files with 77 additions and 5 deletions

View File

@@ -30,16 +30,21 @@
#include "customtoolchain.h"
#include "abiwidget.h"
#include "gccparser.h"
#include "clangparser.h"
#include "linuxiccparser.h"
#include "msvcparser.h"
#include "projectexplorerconstants.h"
#include "toolchainmanager.h"
#include <utils/detailswidget.h>
#include <utils/environment.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h>
#include <QFormLayout>
#include <QPlainTextEdit>
#include <QLineEdit>
#include <QComboBox>
using namespace Utils;
@@ -57,13 +62,15 @@ static const char predefinedMacrosKeyC[] = "ProjectExplorer.CustomToolChain.Pred
static const char headerPathsKeyC[] = "ProjectExplorer.CustomToolChain.HeaderPaths";
static const char cxx11FlagsKeyC[] = "ProjectExplorer.CustomToolChain.Cxx11Flags";
static const char mkspecsKeyC[] = "ProjectExplorer.CustomToolChain.Mkspecs";
static const char outputParserKeyC[] = "ProjectExplorer.CustomToolChain.OutputParser";
// --------------------------------------------------------------------------
// CustomToolChain
// --------------------------------------------------------------------------
CustomToolChain::CustomToolChain(bool autodetect) :
ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect)
ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect),
m_outputParser(Gcc)
{ }
CustomToolChain::CustomToolChain(const QString &id, bool autodetect) :
@@ -188,10 +195,15 @@ QList<FileName> CustomToolChain::suggestedMkspecList() const
return m_mkspecs;
}
// TODO: Customize
IOutputParser *CustomToolChain::outputParser() const
{
return new GccParser;
switch (m_outputParser) {
case Gcc: return new GccParser;
case Clang: return new ClangParser;
case LinuxIcc: return new LinuxIccParser;
case Msvc: return new MsvcParser;
default: return 0;
}
}
QStringList CustomToolChain::headerPathsList() const
@@ -279,6 +291,7 @@ QVariantMap CustomToolChain::toMap() const
data.insert(QLatin1String(headerPathsKeyC), headerPathsList());
data.insert(QLatin1String(cxx11FlagsKeyC), m_cxx11Flags);
data.insert(QLatin1String(mkspecsKeyC), mkspecs());
data.insert(QLatin1String(outputParserKeyC), m_outputParser);
return data;
}
@@ -295,6 +308,8 @@ bool CustomToolChain::fromMap(const QVariantMap &data)
setHeaderPaths(data.value(QLatin1String(headerPathsKeyC)).toStringList());
m_cxx11Flags = data.value(QLatin1String(cxx11FlagsKeyC)).toStringList();
setMkspecs(data.value(QLatin1String(mkspecsKeyC)).toString());
m_outputParser = (OutputParser)data.value(QLatin1String(outputParserKeyC)).toInt();
QTC_ASSERT(m_outputParser >= Gcc && m_outputParser < OutputParserCount, return false);
return true;
}
@@ -312,6 +327,27 @@ bool CustomToolChain::operator ==(const ToolChain &other) const
&& m_systemHeaderPaths == customTc->m_systemHeaderPaths;
}
CustomToolChain::OutputParser CustomToolChain::outputParserType() const
{
return m_outputParser;
}
void CustomToolChain::setOutputParserType(CustomToolChain::OutputParser parser)
{
m_outputParser = parser;
}
QString CustomToolChain::parserName(CustomToolChain::OutputParser parser)
{
switch (parser) {
case Gcc: return tr("GCC");
case Clang: return tr("Clang");
case LinuxIcc: return tr("ICC");
case Msvc: return tr("MSVC");
default: return QString();
}
}
ToolChainConfigWidget *CustomToolChain::configurationWidget()
{
return new Internal::CustomToolChainConfigWidget(this);
@@ -419,10 +455,14 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
m_predefinedDetails(new TextEditDetailsWidget(m_predefinedMacros)),
m_headerDetails(new TextEditDetailsWidget(m_headerPaths)),
m_cxx11Flags(new QLineEdit),
m_mkspecs(new QLineEdit)
m_mkspecs(new QLineEdit),
m_errorParserComboBox(new QComboBox)
{
Q_ASSERT(tc);
for (int i = 0; i < CustomToolChain::OutputParserCount; ++i)
m_errorParserComboBox->addItem(CustomToolChain::parserName((CustomToolChain::OutputParser)i));
m_predefinedMacros->setTabChangesFocus(true);
m_predefinedMacros->setToolTip(tr("Each line defines a macro. Format is MACRO[=VALUE]"));
m_headerPaths->setTabChangesFocus(true);
@@ -438,6 +478,8 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
m_mainLayout->addRow(tr("&Header paths:"), m_headerDetails);
m_mainLayout->addRow(tr("C++11 &flags:"), m_cxx11Flags);
m_mainLayout->addRow(tr("&Qt mkspecs:"), m_mkspecs);
m_mainLayout->addRow(tr("Error Parser:"), m_errorParserComboBox);
m_mainLayout->addRow(tr("&Error Parser:"), m_parserLayout);
addErrorLabel();
setFromToolchain();
@@ -447,6 +489,9 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
connect(m_abiWidget, SIGNAL(abiChanged()), this, SIGNAL(dirty()));
connect(m_predefinedMacros, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
connect(m_headerPaths, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
connect(m_errorParserComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(errorParserChanged(int)));
errorParserChanged(m_errorParserComboBox->currentIndex());
}
void CustomToolChainConfigWidget::updateSummaries()
@@ -457,6 +502,12 @@ void CustomToolChainConfigWidget::updateSummaries()
m_headerDetails->updateSummaryText();
}
void CustomToolChainConfigWidget::errorParserChanged(int index)
{
Q_UNUSED(index);
emit dirty();
}
void CustomToolChainConfigWidget::applyImpl()
{
if (toolChain()->isAutoDetected())
@@ -473,6 +524,7 @@ void CustomToolChainConfigWidget::applyImpl()
tc->setCxx11Flags(m_cxx11Flags->text().split(QLatin1Char(',')));
tc->setMkspecs(m_mkspecs->text());
tc->setDisplayName(displayName); // reset display name
tc->setOutputParserType((CustomToolChain::OutputParser)m_errorParserComboBox->currentIndex());
}
void CustomToolChainConfigWidget::setFromToolchain()
@@ -487,6 +539,7 @@ void CustomToolChainConfigWidget::setFromToolchain()
m_headerPaths->setPlainText(tc->headerPathsList().join(QLatin1String("\n")));
m_cxx11Flags->setText(tc->cxx11Flags().join(QLatin1String(",")));
m_mkspecs->setText(tc->mkspecs());
m_errorParserComboBox->setCurrentIndex(tc->outputParserType());
blockSignals(blocked);
}
@@ -500,7 +553,8 @@ bool CustomToolChainConfigWidget::isDirtyImpl() const
|| m_predefinedDetails->entries() != tc->rawPredefinedMacros()
|| m_headerDetails->entries() != tc->headerPathsList()
|| m_cxx11Flags->text().split(QLatin1Char(',')) != tc->cxx11Flags()
|| m_mkspecs->text() != tc->mkspecs();
|| m_mkspecs->text() != tc->mkspecs()
|| m_errorParserComboBox->currentIndex() == tc->outputParserType();
}
void CustomToolChainConfigWidget::makeReadOnlyImpl()

View File

@@ -42,6 +42,7 @@
QT_BEGIN_NAMESPACE
class QPlainTextEdit;
class QTextEdit;
class QComboBox;
QT_END_NAMESPACE
namespace Utils { class PathChooser; }
@@ -57,7 +58,18 @@ namespace Internal { class CustomToolChainFactory; }
class PROJECTEXPLORER_EXPORT CustomToolChain : public ToolChain
{
Q_DECLARE_TR_FUNCTIONS(CustomToolChain)
public:
enum OutputParser
{
Gcc = 0,
Clang = 1,
LinuxIcc = 2,
Msvc = 3,
OutputParserCount
};
QString type() const;
QString typeDisplayName() const;
Abi targetAbi() const;
@@ -98,6 +110,9 @@ public:
ToolChain *clone() const;
OutputParser outputParserType() const;
void setOutputParserType(OutputParser parser);
static QString parserName(OutputParser parser);
protected:
CustomToolChain(const QString &id, bool autodetect);
CustomToolChain(const CustomToolChain &);
@@ -114,6 +129,7 @@ private:
QStringList m_cxx11Flags;
QList<Utils::FileName> m_mkspecs;
OutputParser m_outputParser;
friend class Internal::CustomToolChainFactory;
friend class ToolChainFactory;
};
@@ -157,6 +173,7 @@ public:
private slots:
void updateSummaries();
void errorParserChanged(int index);
protected:
void applyImpl();
@@ -175,6 +192,7 @@ protected:
TextEditDetailsWidget *m_headerDetails;
QLineEdit *m_cxx11Flags;
QLineEdit *m_mkspecs;
QComboBox *m_errorParserComboBox;
};
} // namespace Internal