Clang: Introduce warning configuration per project

Change-Id: I5b9a330274e6f72b0786259eb25aa454877d4eef
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2016-02-26 17:50:38 +01:00
parent b590642a85
commit 83e18c127c
17 changed files with 600 additions and 40 deletions

View File

@@ -32,7 +32,6 @@
#include <QCoreApplication>
namespace CppTools {
namespace Internal {
static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &model)
{
@@ -110,6 +109,11 @@ const ClangDiagnosticConfig &ClangDiagnosticConfigsModel::at(int index) const
return m_diagnosticConfigs.at(index);
}
void ClangDiagnosticConfigsModel::prepend(const ClangDiagnosticConfig &config)
{
m_diagnosticConfigs.prepend(config);
}
void ClangDiagnosticConfigsModel::appendOrUpdate(const ClangDiagnosticConfig &config)
{
const int index = indexOfConfig(config.id());
@@ -130,11 +134,25 @@ ClangDiagnosticConfigs ClangDiagnosticConfigsModel::configs() const
return m_diagnosticConfigs;
}
bool ClangDiagnosticConfigsModel::hasConfigWithId(const Core::Id &id) const
{
return indexOfConfig(id) != -1;
}
const ClangDiagnosticConfig &ClangDiagnosticConfigsModel::configWithId(const Core::Id &id) const
{
return m_diagnosticConfigs.at(indexOfConfig(id));
}
QString
ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config)
{
return config.isReadOnly()
? QCoreApplication::translate("ClangDiagnosticConfigsModel", "%1 [built-in]")
.arg(config.displayName())
: config.displayName();
}
int ClangDiagnosticConfigsModel::indexOfConfig(const Core::Id &id) const
{
return Utils::indexOf(m_diagnosticConfigs, [&](const ClangDiagnosticConfig &config) {
@@ -142,5 +160,4 @@ int ClangDiagnosticConfigsModel::indexOfConfig(const Core::Id &id) const
});
}
} // namespace Internal
} // namespace CppTools

View File

@@ -25,25 +25,31 @@
#pragma once
#include "cpptools_global.h"
#include "clangdiagnosticconfig.h"
namespace CppTools {
namespace Internal {
class ClangDiagnosticConfigsModel
class CPPTOOLS_EXPORT ClangDiagnosticConfigsModel
{
public:
ClangDiagnosticConfigsModel() = default;
ClangDiagnosticConfigsModel(const ClangDiagnosticConfigs &customConfigs);
int size() const;
const ClangDiagnosticConfig &at(int index) const;
void prepend(const ClangDiagnosticConfig &config);
void appendOrUpdate(const ClangDiagnosticConfig &config);
void removeConfigWithId(const Core::Id &id);
ClangDiagnosticConfigs configs() const;
bool hasConfigWithId(const Core::Id &id) const;
const ClangDiagnosticConfig &configWithId(const Core::Id &id) const;
static QString displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config);
private:
int indexOfConfig(const Core::Id &id) const;
@@ -51,5 +57,4 @@ private:
ClangDiagnosticConfigs m_diagnosticConfigs;
};
} // namespace Internal
} // namespace CppTools

View File

@@ -34,28 +34,23 @@
#include <QUuid>
namespace CppTools {
namespace Internal {
ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(
const ClangDiagnosticConfigs &customConfigs,
const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
const Core::Id &configToSelect,
QWidget *parent)
: QWidget(parent)
, m_ui(new Ui::ClangDiagnosticConfigsWidget)
, m_diagnosticConfigsModel(customConfigs)
, m_diagnosticConfigsModel(diagnosticConfigsModel)
{
m_ui->setupUi(this);
connect(m_ui->configChooserComboBox,
static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&ClangDiagnosticConfigsWidget::onCurrentConfigChanged);
connectConfigChooserCurrentIndex();
connect(m_ui->copyButton, &QPushButton::clicked,
this, &ClangDiagnosticConfigsWidget::onCopyButtonClicked);
connect(m_ui->removeButton, &QPushButton::clicked,
this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked);
connect(m_ui->diagnosticOptionsTextEdit->document(), &QTextDocument::contentsChanged,
this, &ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited);
connectDiagnosticOptionsChanged();
syncWidgetsToModel(configToSelect);
}
@@ -68,6 +63,8 @@ ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget()
void ClangDiagnosticConfigsWidget::onCurrentConfigChanged(int)
{
syncOtherWidgetsToComboBox();
emit currentConfigChanged(currentConfigId());
}
static ClangDiagnosticConfig createCustomConfig(const ClangDiagnosticConfig &config,
@@ -95,6 +92,7 @@ void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
if (diaglogAccepted) {
const ClangDiagnosticConfig customConfig = createCustomConfig(config, newName);
m_diagnosticConfigsModel.appendOrUpdate(customConfig);
emit customConfigsChanged(customConfigs());
syncConfigChooserToModel(customConfig.id());
m_ui->diagnosticOptionsTextEdit->setFocus();
@@ -104,6 +102,7 @@ void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
{
m_diagnosticConfigsModel.removeConfigWithId(currentConfigId());
emit customConfigsChanged(customConfigs());
syncConfigChooserToModel();
}
@@ -119,6 +118,7 @@ void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
updatedConfig.setCommandLineOptions(updatedCommandLine);
m_diagnosticConfigsModel.appendOrUpdate(updatedConfig);
emit customConfigsChanged(customConfigs());
}
void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSelect)
@@ -127,29 +127,40 @@ void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSe
syncOtherWidgetsToComboBox();
}
static QString adaptedDisplayName(const ClangDiagnosticConfig &config)
static QString displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config,
const Core::Id &exceptionalConfig)
{
return config.isReadOnly()
? QObject::tr("%1 [built-in]").arg(config.displayName())
: config.displayName();
if (exceptionalConfig == config.id())
return config.displayName();
return ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config);
}
void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &configToSelect)
{
disconnectConfigChooserCurrentIndex();
const int previousCurrentIndex = m_ui->configChooserComboBox->currentIndex();
m_ui->configChooserComboBox->clear();
int currentIndex = -1;
int configToSelectIndex = -1;
const int size = m_diagnosticConfigsModel.size();
for (int i = 0; i < size; ++i) {
const ClangDiagnosticConfig &config = m_diagnosticConfigsModel.at(i);
m_ui->configChooserComboBox->addItem(adaptedDisplayName(config), config.id().toSetting());
const QString displayName
= displayNameWithBuiltinIndication(config, m_configWithUndecoratedDisplayName);
m_ui->configChooserComboBox->addItem(displayName, config.id().toSetting());
if (configToSelect == config.id())
currentIndex = i;
configToSelectIndex = i;
}
if (currentIndex != -1)
m_ui->configChooserComboBox->setCurrentIndex(currentIndex);
connectConfigChooserCurrentIndex();
if (configToSelectIndex != -1)
m_ui->configChooserComboBox->setCurrentIndex(configToSelectIndex);
else if (previousCurrentIndex != m_ui->configChooserComboBox->currentIndex())
emit currentConfigChanged(currentConfigId());
}
void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
@@ -164,7 +175,7 @@ void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
// Update child widgets
const QString commandLineOptions = config.commandLineOptions().join(QLatin1Char(' '));
m_ui->diagnosticOptionsTextEdit->document()->setPlainText(commandLineOptions);
setDiagnosticOptions(commandLineOptions);
m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly());
}
@@ -178,6 +189,48 @@ const ClangDiagnosticConfig &ClangDiagnosticConfigsWidget::currentConfig() const
return m_diagnosticConfigsModel.configWithId(currentConfigId());
}
void ClangDiagnosticConfigsWidget::setDiagnosticOptions(const QString &options)
{
if (options != m_ui->diagnosticOptionsTextEdit->document()->toPlainText()) {
disconnectDiagnosticOptionsChanged();
m_ui->diagnosticOptionsTextEdit->document()->setPlainText(options);
connectDiagnosticOptionsChanged();
}
}
void ClangDiagnosticConfigsWidget::connectConfigChooserCurrentIndex()
{
connect(m_ui->configChooserComboBox,
static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&ClangDiagnosticConfigsWidget::onCurrentConfigChanged);
}
void ClangDiagnosticConfigsWidget::disconnectConfigChooserCurrentIndex()
{
disconnect(m_ui->configChooserComboBox,
static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&ClangDiagnosticConfigsWidget::onCurrentConfigChanged);
}
void ClangDiagnosticConfigsWidget::connectDiagnosticOptionsChanged()
{
connect(m_ui->diagnosticOptionsTextEdit->document(), &QTextDocument::contentsChanged,
this, &ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited);
}
void ClangDiagnosticConfigsWidget::disconnectDiagnosticOptionsChanged()
{
disconnect(m_ui->diagnosticOptionsTextEdit->document(), &QTextDocument::contentsChanged,
this, &ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited);
}
void ClangDiagnosticConfigsWidget::setConfigWithUndecoratedDisplayName(const Core::Id &id)
{
m_configWithUndecoratedDisplayName = id;
}
Core::Id ClangDiagnosticConfigsWidget::currentConfigId() const
{
return Core::Id::fromSetting(m_ui->configChooserComboBox->currentData());
@@ -192,5 +245,12 @@ ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::customConfigs() const
});
}
} // Internal namespace
void ClangDiagnosticConfigsWidget::refresh(
const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
const Core::Id &configToSelect)
{
m_diagnosticConfigsModel = diagnosticConfigsModel;
syncWidgetsToModel(configToSelect);
}
} // CppTools namespace

View File

@@ -25,29 +25,38 @@
#pragma once
#include "cpptools_global.h"
#include "clangdiagnosticconfig.h"
#include "clangdiagnosticconfigsmodel.h"
#include <QWidget>
namespace CppTools {
namespace Internal {
namespace Ui { class ClangDiagnosticConfigsWidget; }
class ClangDiagnosticConfigsWidget : public QWidget
class CPPTOOLS_EXPORT ClangDiagnosticConfigsWidget : public QWidget
{
Q_OBJECT
public:
explicit ClangDiagnosticConfigsWidget(const ClangDiagnosticConfigs &customConfigs,
const Core::Id &configToSelect,
QWidget *parent = 0);
explicit ClangDiagnosticConfigsWidget(
const ClangDiagnosticConfigsModel &diagnosticConfigsModel = ClangDiagnosticConfigsModel(),
const Core::Id &configToSelect = Core::Id(),
QWidget *parent = 0);
~ClangDiagnosticConfigsWidget();
Core::Id currentConfigId() const;
ClangDiagnosticConfigs customConfigs() const;
~ClangDiagnosticConfigsWidget();
void setConfigWithUndecoratedDisplayName(const Core::Id &id);
void refresh(const ClangDiagnosticConfigsModel &diagnosticConfigsModel,
const Core::Id &configToSelect);
signals:
void currentConfigChanged(const Core::Id &currentConfigId);
void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs);
private slots:
void onCurrentConfigChanged(int);
@@ -64,10 +73,17 @@ private:
bool isConfigChooserEmpty() const;
const ClangDiagnosticConfig &currentConfig() const;
void setDiagnosticOptions(const QString &options);
void connectConfigChooserCurrentIndex();
void disconnectConfigChooserCurrentIndex();
void connectDiagnosticOptionsChanged();
void disconnectDiagnosticOptionsChanged();
private:
Ui::ClangDiagnosticConfigsWidget *m_ui;
ClangDiagnosticConfigsModel m_diagnosticConfigsModel;
Core::Id m_configWithUndecoratedDisplayName;
};
} // Internal namespace
} // CppTools namespace

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CppTools::Internal::ClangDiagnosticConfigsWidget</class>
<widget class="QWidget" name="CppTools::Internal::ClangDiagnosticConfigsWidget">
<class>CppTools::ClangDiagnosticConfigsWidget</class>
<widget class="QWidget" name="CppTools::ClangDiagnosticConfigsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>545</width>
<width>597</width>
<height>300</height>
</rect>
</property>

View File

@@ -121,7 +121,7 @@ void CppCodeModelSettings::setClangDiagnosticConfigId(const Core::Id &configId)
const ClangDiagnosticConfig CppCodeModelSettings::clangDiagnosticConfig() const
{
const Internal::ClangDiagnosticConfigsModel configsModel(m_clangCustomDiagnosticConfigs);
const ClangDiagnosticConfigsModel configsModel(m_clangCustomDiagnosticConfigs);
return configsModel.configWithId(clangDiagnosticConfigId());
}

View File

@@ -78,8 +78,9 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets()
m_ui->activateClangCodeModelPluginHint->setVisible(!isClangActive);
m_ui->clangSettingsGroupBox->setEnabled(isClangActive);
ClangDiagnosticConfigsModel diagnosticConfigsModel(m_settings->clangCustomDiagnosticConfigs());
m_clangDiagnosticConfigsWidget = new ClangDiagnosticConfigsWidget(
m_settings->clangCustomDiagnosticConfigs(),
diagnosticConfigsModel,
m_settings->clangDiagnosticConfigId());
m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget);
}

View File

@@ -37,10 +37,11 @@ QT_FORWARD_DECLARE_CLASS(QComboBox)
QT_FORWARD_DECLARE_CLASS(QSettings)
namespace CppTools {
namespace Internal {
class ClangDiagnosticConfigsWidget;
namespace Internal {
namespace Ui { class CppCodeModelSettingsPage; }
class CppCodeModelSettingsWidget: public QWidget