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

View File

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