forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ¤tConfigId);
|
||||
void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs);
|
||||
|
||||
private slots:
|
||||
void onCurrentConfigChanged(int);
|
||||
@@ -64,10 +73,17 @@ private:
|
||||
bool isConfigChooserEmpty() const;
|
||||
const ClangDiagnosticConfig ¤tConfig() 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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user