Clang: Make clazy/tidy options part of the diagnostic config

As a side effect, clazy/tidy options become available for project
specific customization in the projects mode.

Change-Id: Id72762dedd857915139c15f532d2f1c6d1f43edb
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-01-26 10:27:58 +01:00
parent 5b1ae09fbf
commit 33b6fe812a
13 changed files with 212 additions and 191 deletions

View File

@@ -487,7 +487,10 @@ private:
void addDiagnosticOptionsForConfig(const CppTools::ClangDiagnosticConfig &diagnosticConfig) void addDiagnosticOptionsForConfig(const CppTools::ClangDiagnosticConfig &diagnosticConfig)
{ {
m_diagnosticConfigId = diagnosticConfig.id(); m_diagnosticConfigId = diagnosticConfig.id();
m_options.append(diagnosticConfig.commandLineWarnings());
m_options.append(diagnosticConfig.clangOptions());
addClangTidyOptions(diagnosticConfig.clangTidyChecks());
addClazyOptions(diagnosticConfig.clazyChecks());
} }
void addXclangArg(const QString &argName, const QString &argValue = QString()) void addXclangArg(const QString &argName, const QString &argValue = QString())
@@ -500,24 +503,22 @@ private:
} }
} }
void addTidyOptions() void addClangTidyOptions(const QString &checks)
{ {
const QString tidyChecks = CppTools::codeModelSettings()->tidyChecks(); if (checks.isEmpty())
if (tidyChecks.isEmpty())
return; return;
addXclangArg("-add-plugin", "clang-tidy"); addXclangArg("-add-plugin", "clang-tidy");
addXclangArg("-plugin-arg-clang-tidy", "-checks='-*" + tidyChecks + "'"); addXclangArg("-plugin-arg-clang-tidy", "-checks='-*" + checks + "'");
} }
void addClazyOptions() void addClazyOptions(const QString &checks)
{ {
const QString clazyChecks = CppTools::codeModelSettings()->clazyChecks(); if (checks.isEmpty())
if (clazyChecks.isEmpty())
return; return;
addXclangArg("-add-plugin", "clang-lazy"); addXclangArg("-add-plugin", "clang-lazy");
addXclangArg("-plugin-arg-clang-lazy", clazyChecks); addXclangArg("-plugin-arg-clang-lazy", checks);
} }
void addGlobalOptions() void addGlobalOptions()
@@ -526,9 +527,6 @@ private:
m_options.append(ClangProjectSettings::globalCommandLineOptions()); m_options.append(ClangProjectSettings::globalCommandLineOptions());
else else
m_options.append(getProjectSettings(m_projectPart.project).commandLineOptions()); m_options.append(getProjectSettings(m_projectPart.project).commandLineOptions());
addTidyOptions();
addClazyOptions();
} }
void addPrecompiledHeaderOptions() void addPrecompiledHeaderOptions()

View File

@@ -47,14 +47,14 @@ void ClangDiagnosticConfig::setDisplayName(const QString &displayName)
m_displayName = displayName; m_displayName = displayName;
} }
QStringList ClangDiagnosticConfig::commandLineWarnings() const QStringList ClangDiagnosticConfig::clangOptions() const
{ {
return m_commandLineWarnings; return m_clangOptions;
} }
void ClangDiagnosticConfig::setCommandLineWarnings(const QStringList &warnings) void ClangDiagnosticConfig::setClangOptions(const QStringList &options)
{ {
m_commandLineWarnings = warnings; m_clangOptions = options;
} }
bool ClangDiagnosticConfig::isReadOnly() const bool ClangDiagnosticConfig::isReadOnly() const
@@ -71,7 +71,9 @@ bool ClangDiagnosticConfig::operator==(const ClangDiagnosticConfig &other) const
{ {
return m_id == other.m_id return m_id == other.m_id
&& m_displayName == other.m_displayName && m_displayName == other.m_displayName
&& m_commandLineWarnings == other.m_commandLineWarnings && m_clangOptions == other.m_clangOptions
&& m_clangTidyChecks == other.m_clangTidyChecks
&& m_clazyChecks == other.m_clazyChecks
&& m_isReadOnly == other.m_isReadOnly; && m_isReadOnly == other.m_isReadOnly;
} }
@@ -80,4 +82,24 @@ bool ClangDiagnosticConfig::operator!=(const ClangDiagnosticConfig &other) const
return !(*this == other); return !(*this == other);
} }
QString ClangDiagnosticConfig::clangTidyChecks() const
{
return m_clangTidyChecks;
}
void ClangDiagnosticConfig::setClangTidyChecks(const QString &checks)
{
m_clangTidyChecks = checks;
}
QString ClangDiagnosticConfig::clazyChecks() const
{
return m_clazyChecks;
}
void ClangDiagnosticConfig::setClazyChecks(const QString &checks)
{
m_clazyChecks = checks;
}
} // namespace CppTools } // namespace CppTools

View File

@@ -43,8 +43,14 @@ public:
QString displayName() const; QString displayName() const;
void setDisplayName(const QString &displayName); void setDisplayName(const QString &displayName);
QStringList commandLineWarnings() const; QStringList clangOptions() const;
void setCommandLineWarnings(const QStringList &commandLineWarnings); void setClangOptions(const QStringList &options);
QString clangTidyChecks() const;
void setClangTidyChecks(const QString &checks);
QString clazyChecks() const;
void setClazyChecks(const QString &checks);
bool isReadOnly() const; bool isReadOnly() const;
void setIsReadOnly(bool isReadOnly); void setIsReadOnly(bool isReadOnly);
@@ -55,7 +61,9 @@ public:
private: private:
Core::Id m_id; Core::Id m_id;
QString m_displayName; QString m_displayName;
QStringList m_commandLineWarnings; QStringList m_clangOptions;
QString m_clangTidyChecks;
QString m_clazyChecks;
bool m_isReadOnly = false; bool m_isReadOnly = false;
}; };

View File

@@ -45,7 +45,7 @@ static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &mode
config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel",
"Warnings for questionable constructs")); "Warnings for questionable constructs"));
config.setIsReadOnly(true); config.setIsReadOnly(true);
config.setCommandLineWarnings(QStringList{ config.setClangOptions(QStringList{
QStringLiteral("-Wall"), QStringLiteral("-Wall"),
QStringLiteral("-Wextra"), QStringLiteral("-Wextra"),
} + commonWarnings()); } + commonWarnings());
@@ -60,7 +60,7 @@ static void addConfigForPedanticWarnings(ClangDiagnosticConfigsModel &model)
config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel",
"Pedantic Warnings")); "Pedantic Warnings"));
config.setIsReadOnly(true); config.setIsReadOnly(true);
config.setCommandLineWarnings(QStringList{QStringLiteral("-Wpedantic")} + commonWarnings()); config.setClangOptions(QStringList{QStringLiteral("-Wpedantic")} + commonWarnings());
model.appendOrUpdate(config); model.appendOrUpdate(config);
} }
@@ -72,7 +72,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model)
config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel",
"Warnings for almost everything")); "Warnings for almost everything"));
config.setIsReadOnly(true); config.setIsReadOnly(true);
config.setCommandLineWarnings(QStringList{ config.setClangOptions(QStringList{
QStringLiteral("-Weverything"), QStringLiteral("-Weverything"),
QStringLiteral("-Wno-c++98-compat"), QStringLiteral("-Wno-c++98-compat"),
QStringLiteral("-Wno-c++98-compat-pedantic"), QStringLiteral("-Wno-c++98-compat-pedantic"),

View File

@@ -25,6 +25,8 @@
#include "clangdiagnosticconfigswidget.h" #include "clangdiagnosticconfigswidget.h"
#include "ui_clangdiagnosticconfigswidget.h" #include "ui_clangdiagnosticconfigswidget.h"
#include "ui_clazychecks.h"
#include "ui_tidychecks.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -45,6 +47,7 @@ ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(
, m_diagnosticConfigsModel(diagnosticConfigsModel) , m_diagnosticConfigsModel(diagnosticConfigsModel)
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
setupPluginsWidgets();
connectConfigChooserCurrentIndex(); connectConfigChooserCurrentIndex();
connect(m_ui->copyButton, &QPushButton::clicked, connect(m_ui->copyButton, &QPushButton::clicked,
@@ -108,6 +111,18 @@ void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
syncConfigChooserToModel(); syncConfigChooserToModel();
} }
void ClangDiagnosticConfigsWidget::onClangTidyItemChanged(QListWidgetItem *item)
{
const QString prefix = item->text();
ClangDiagnosticConfig config = currentConfig();
QString checks = config.clangTidyChecks();
item->checkState() == Qt::Checked
? checks.append(',' + prefix)
: checks.remove(',' + prefix);
config.setClangTidyChecks(checks);
updateConfig(config);
}
static bool isAcceptedWarningOption(const QString &option) static bool isAcceptedWarningOption(const QString &option)
{ {
return option == "-w" return option == "-w"
@@ -162,10 +177,8 @@ void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
// Commit valid changes // Commit valid changes
ClangDiagnosticConfig updatedConfig = currentConfig(); ClangDiagnosticConfig updatedConfig = currentConfig();
updatedConfig.setCommandLineWarnings(normalizedOptions); updatedConfig.setClangOptions(normalizedOptions);
updateConfig(updatedConfig);
m_diagnosticConfigsModel.appendOrUpdate(updatedConfig);
emit customConfigsChanged(customConfigs());
} }
void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSelect) void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSelect)
@@ -213,12 +226,74 @@ void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
// Update main button row // Update main button row
m_ui->removeButton->setEnabled(!config.isReadOnly()); m_ui->removeButton->setEnabled(!config.isReadOnly());
// Update child widgets // Update Text Edit
const QString options = m_notAcceptedOptions.contains(config.id()) const QString options = m_notAcceptedOptions.contains(config.id())
? m_notAcceptedOptions.value(config.id()) ? m_notAcceptedOptions.value(config.id())
: config.commandLineWarnings().join(QLatin1Char(' ')); : config.clangOptions().join(QLatin1Char(' '));
setDiagnosticOptions(options); setDiagnosticOptions(options);
m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly()); m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly());
syncClangTidyWidgets(config);
syncClazyWidgets(config);
}
void ClangDiagnosticConfigsWidget::syncClangTidyWidgets(const ClangDiagnosticConfig &config)
{
disconnectClangTidyItemChanged();
const QString tidyChecks = config.clangTidyChecks();
for (int row = 0; row < m_tidyChecks->checksList->count(); ++row) {
QListWidgetItem *item = m_tidyChecks->checksList->item(row);
Qt::ItemFlags flags = item->flags();
flags |= Qt::ItemIsUserCheckable;
if (config.isReadOnly())
flags &= ~Qt::ItemIsEnabled;
else
flags |= Qt::ItemIsEnabled;
item->setFlags(flags);
if (tidyChecks.indexOf(item->text()) != -1)
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
}
connectClangTidyItemChanged();
}
void ClangDiagnosticConfigsWidget::syncClazyWidgets(const ClangDiagnosticConfig &config)
{
const QString clazyChecks = config.clazyChecks();
if (clazyChecks.isEmpty())
m_clazyChecks->clazyLevel->setCurrentIndex(0);
else
m_clazyChecks->clazyLevel->setCurrentText(clazyChecks);
m_clazyChecksWidget->setEnabled(!config.isReadOnly());
}
void ClangDiagnosticConfigsWidget::setClazyLevelDescription(int index)
{
// Levels descriptions are taken from https://github.com/KDE/clazy
static const QString levelDescriptions[] {
QString(),
tr("Very stable checks, 99.99% safe, no false-positives."),
tr("Similar to level 0, but sometimes (rarely) there might be\n"
"some false-positives."),
tr("Sometimes has false-positives (20-30%)."),
tr("Not always correct, possibly very noisy, might require\n"
"a knowledgeable developer to review, might have a very big\n"
"rate of false-positives, might have bugs.")
};
QTC_ASSERT(m_clazyChecks, return);
m_clazyChecks->levelDescription->setText(levelDescriptions[static_cast<unsigned>(index)]);
}
void ClangDiagnosticConfigsWidget::updateConfig(const ClangDiagnosticConfig &config)
{
m_diagnosticConfigsModel.appendOrUpdate(config);
emit customConfigsChanged(customConfigs());
} }
bool ClangDiagnosticConfigsWidget::isConfigChooserEmpty() const bool ClangDiagnosticConfigsWidget::isConfigChooserEmpty() const
@@ -264,6 +339,18 @@ void ClangDiagnosticConfigsWidget::updateValidityWidgets(const QString &errorMes
m_ui->validationResultLabel->setStyleSheet(styleSheet); m_ui->validationResultLabel->setStyleSheet(styleSheet);
} }
void ClangDiagnosticConfigsWidget::connectClangTidyItemChanged()
{
connect(m_tidyChecks->checksList, &QListWidget::itemChanged,
this, &ClangDiagnosticConfigsWidget::onClangTidyItemChanged);
}
void ClangDiagnosticConfigsWidget::disconnectClangTidyItemChanged()
{
disconnect(m_tidyChecks->checksList, &QListWidget::itemChanged,
this, &ClangDiagnosticConfigsWidget::onClangTidyItemChanged);
}
void ClangDiagnosticConfigsWidget::connectConfigChooserCurrentIndex() void ClangDiagnosticConfigsWidget::connectConfigChooserCurrentIndex()
{ {
connect(m_ui->configChooserComboBox, connect(m_ui->configChooserComboBox,
@@ -314,4 +401,31 @@ void ClangDiagnosticConfigsWidget::refresh(
syncWidgetsToModel(configToSelect); syncWidgetsToModel(configToSelect);
} }
void ClangDiagnosticConfigsWidget::setupPluginsWidgets()
{
m_clazyChecks.reset(new CppTools::Ui::ClazyChecks);
m_clazyChecksWidget = new QWidget();
m_clazyChecks->setupUi(m_clazyChecksWidget);
connect(m_clazyChecks->clazyLevel,
static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
[this](int index) {
setClazyLevelDescription(index);
ClangDiagnosticConfig config = currentConfig();
if (index == 0)
config.setClazyChecks(QString());
else
config.setClazyChecks(m_clazyChecks->clazyLevel->itemText(index));
updateConfig(config);
});
m_tidyChecks.reset(new CppTools::Ui::TidyChecks);
m_tidyChecksWidget = new QWidget();
m_tidyChecks->setupUi(m_tidyChecksWidget);
connectClangTidyItemChanged();
m_ui->pluginChecksTabs->addTab(m_tidyChecksWidget, tr("Clang-Tidy"));
m_ui->pluginChecksTabs->addTab(m_clazyChecksWidget, tr("Clazy"));
m_ui->pluginChecksTabs->setCurrentIndex(0);
}
} // CppTools namespace } // CppTools namespace

View File

@@ -33,9 +33,17 @@
#include <QHash> #include <QHash>
#include <QWidget> #include <QWidget>
#include <memory>
QT_FORWARD_DECLARE_CLASS(QListWidgetItem)
namespace CppTools { namespace CppTools {
namespace Ui { class ClangDiagnosticConfigsWidget; } namespace Ui {
class ClangDiagnosticConfigsWidget;
class ClazyChecks;
class TidyChecks;
}
class CPPTOOLS_EXPORT ClangDiagnosticConfigsWidget : public QWidget class CPPTOOLS_EXPORT ClangDiagnosticConfigsWidget : public QWidget
{ {
@@ -59,15 +67,23 @@ signals:
void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs); void customConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs);
private: private:
void setupPluginsWidgets();
void onCurrentConfigChanged(int); void onCurrentConfigChanged(int);
void onCopyButtonClicked(); void onCopyButtonClicked();
void onRemoveButtonClicked(); void onRemoveButtonClicked();
void onClangTidyItemChanged(QListWidgetItem *item);
void onDiagnosticOptionsEdited(); void onDiagnosticOptionsEdited();
void syncWidgetsToModel(const Core::Id &configToSelect = Core::Id()); void syncWidgetsToModel(const Core::Id &configToSelect = Core::Id());
void syncConfigChooserToModel(const Core::Id &configToSelect = Core::Id()); void syncConfigChooserToModel(const Core::Id &configToSelect = Core::Id());
void syncOtherWidgetsToComboBox(); void syncOtherWidgetsToComboBox();
void syncClangTidyWidgets(const ClangDiagnosticConfig &config);
void syncClazyWidgets(const ClangDiagnosticConfig &config);
void setClazyLevelDescription(int index);
void updateConfig(const CppTools::ClangDiagnosticConfig &config);
bool isConfigChooserEmpty() const; bool isConfigChooserEmpty() const;
const ClangDiagnosticConfig &currentConfig() const; const ClangDiagnosticConfig &currentConfig() const;
@@ -75,6 +91,9 @@ private:
void setDiagnosticOptions(const QString &options); void setDiagnosticOptions(const QString &options);
void updateValidityWidgets(const QString &errorMessage); void updateValidityWidgets(const QString &errorMessage);
void connectClangTidyItemChanged();
void disconnectClangTidyItemChanged();
void connectConfigChooserCurrentIndex(); void connectConfigChooserCurrentIndex();
void disconnectConfigChooserCurrentIndex(); void disconnectConfigChooserCurrentIndex();
void connectDiagnosticOptionsChanged(); void connectDiagnosticOptionsChanged();
@@ -84,6 +103,12 @@ private:
Ui::ClangDiagnosticConfigsWidget *m_ui; Ui::ClangDiagnosticConfigsWidget *m_ui;
ClangDiagnosticConfigsModel m_diagnosticConfigsModel; ClangDiagnosticConfigsModel m_diagnosticConfigsModel;
QHash<Core::Id, QString> m_notAcceptedOptions; QHash<Core::Id, QString> m_notAcceptedOptions;
std::unique_ptr<CppTools::Ui::ClazyChecks> m_clazyChecks;
QWidget *m_clazyChecksWidget = nullptr;
std::unique_ptr<CppTools::Ui::TidyChecks> m_tidyChecks;
QWidget *m_tidyChecksWidget = nullptr;
}; };
} // CppTools namespace } // CppTools namespace

View File

@@ -93,6 +93,9 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QTabWidget" name="pluginChecksTabs"/>
</item>
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>

View File

@@ -55,6 +55,12 @@ static QString clangDiagnosticConfigsArrayDisplayNameKey()
static QString clangDiagnosticConfigsArrayWarningsKey() static QString clangDiagnosticConfigsArrayWarningsKey()
{ return QLatin1String("diagnosticOptions"); } { return QLatin1String("diagnosticOptions"); }
static QString clangDiagnosticConfigsArrayClangTidyChecksKey()
{ return QLatin1String("clangTidyChecks"); }
static QString clangDiagnosticConfigsArrayClazyChecksKey()
{ return QLatin1String("clazyChecks"); }
static QString pchUsageKey() static QString pchUsageKey()
{ return QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE); } { return QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE); }
@@ -67,12 +73,6 @@ static QString skipIndexingBigFilesKey()
static QString indexerFileSizeLimitKey() static QString indexerFileSizeLimitKey()
{ return QLatin1String(Constants::CPPTOOLS_INDEXER_FILE_SIZE_LIMIT); } { return QLatin1String(Constants::CPPTOOLS_INDEXER_FILE_SIZE_LIMIT); }
static QString tidyChecksKey()
{ return QLatin1String(Constants::CPPTOOLS_TIDY_CHECKS); }
static QString clazyChecksKey()
{ return QLatin1String(Constants::CPPTOOLS_CLAZY_CHECKS); }
static ClangDiagnosticConfigs customDiagnosticConfigsFromSettings(QSettings *s) static ClangDiagnosticConfigs customDiagnosticConfigsFromSettings(QSettings *s)
{ {
QTC_ASSERT(s->group() == QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP), QTC_ASSERT(s->group() == QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP),
@@ -87,7 +87,9 @@ static ClangDiagnosticConfigs customDiagnosticConfigsFromSettings(QSettings *s)
ClangDiagnosticConfig config; ClangDiagnosticConfig config;
config.setId(Core::Id::fromSetting(s->value(clangDiagnosticConfigsArrayIdKey()))); config.setId(Core::Id::fromSetting(s->value(clangDiagnosticConfigsArrayIdKey())));
config.setDisplayName(s->value(clangDiagnosticConfigsArrayDisplayNameKey()).toString()); config.setDisplayName(s->value(clangDiagnosticConfigsArrayDisplayNameKey()).toString());
config.setCommandLineWarnings(s->value(clangDiagnosticConfigsArrayWarningsKey()).toStringList()); config.setClangOptions(s->value(clangDiagnosticConfigsArrayWarningsKey()).toStringList());
config.setClangTidyChecks(s->value(clangDiagnosticConfigsArrayClangTidyChecksKey()).toString());
config.setClazyChecks(s->value(clangDiagnosticConfigsArrayClazyChecksKey()).toString());
configs.append(config); configs.append(config);
} }
s->endArray(); s->endArray();
@@ -123,11 +125,6 @@ void CppCodeModelSettings::fromSettings(QSettings *s)
const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5); const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5);
setIndexerFileSizeLimitInMb(indexerFileSizeLimit.toInt()); setIndexerFileSizeLimitInMb(indexerFileSizeLimit.toInt());
const QVariant tidyChecks = s->value(tidyChecksKey(), QString());
setTidyChecks(tidyChecks.toString());
const QVariant clazyChecks = s->value(clazyChecksKey(), QString());
setClazyChecks(clazyChecks.toString());
s->endGroup(); s->endGroup();
emit changed(); emit changed();
@@ -146,7 +143,9 @@ void CppCodeModelSettings::toSettings(QSettings *s)
s->setArrayIndex(i); s->setArrayIndex(i);
s->setValue(clangDiagnosticConfigsArrayIdKey(), config.id().toSetting()); s->setValue(clangDiagnosticConfigsArrayIdKey(), config.id().toSetting());
s->setValue(clangDiagnosticConfigsArrayDisplayNameKey(), config.displayName()); s->setValue(clangDiagnosticConfigsArrayDisplayNameKey(), config.displayName());
s->setValue(clangDiagnosticConfigsArrayWarningsKey(), config.commandLineWarnings()); s->setValue(clangDiagnosticConfigsArrayWarningsKey(), config.clangOptions());
s->setValue(clangDiagnosticConfigsArrayClangTidyChecksKey(), config.clangTidyChecks());
s->setValue(clangDiagnosticConfigsArrayClazyChecksKey(), config.clazyChecks());
} }
s->endArray(); s->endArray();
@@ -156,8 +155,6 @@ void CppCodeModelSettings::toSettings(QSettings *s)
s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders()); s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders());
s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles());
s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb());
s->setValue(tidyChecksKey(), tidyChecks());
s->setValue(clazyChecksKey(), clazyChecks());
s->endGroup(); s->endGroup();
@@ -239,23 +236,3 @@ void CppCodeModelSettings::setIndexerFileSizeLimitInMb(int sizeInMB)
{ {
m_indexerFileSizeLimitInMB = sizeInMB; m_indexerFileSizeLimitInMB = sizeInMB;
} }
QString CppCodeModelSettings::tidyChecks() const
{
return m_tidyChecks;
}
void CppCodeModelSettings::setTidyChecks(QString checks)
{
m_tidyChecks = checks;
}
QString CppCodeModelSettings::clazyChecks() const
{
return m_clazyChecks;
}
void CppCodeModelSettings::setClazyChecks(QString checks)
{
m_clazyChecks = checks;
}

View File

@@ -72,12 +72,6 @@ public:
int indexerFileSizeLimitInMb() const; int indexerFileSizeLimitInMb() const;
void setIndexerFileSizeLimitInMb(int sizeInMB); void setIndexerFileSizeLimitInMb(int sizeInMB);
QString tidyChecks() const;
void setTidyChecks(QString checks);
QString clazyChecks() const;
void setClazyChecks(QString checks);
signals: signals:
void clangDiagnosticConfigsInvalidated(const QVector<Core::Id> &configId); void clangDiagnosticConfigsInvalidated(const QVector<Core::Id> &configId);
void changed(); void changed();
@@ -89,9 +83,6 @@ private:
int m_indexerFileSizeLimitInMB = 5; int m_indexerFileSizeLimitInMB = 5;
ClangDiagnosticConfigs m_clangCustomDiagnosticConfigs; ClangDiagnosticConfigs m_clangCustomDiagnosticConfigs;
Core::Id m_clangDiagnosticConfigId; Core::Id m_clangDiagnosticConfigId;
QString m_tidyChecks;
QString m_clazyChecks;
}; };
} // namespace CppTools } // namespace CppTools

View File

@@ -29,8 +29,6 @@
#include "cppmodelmanager.h" #include "cppmodelmanager.h"
#include "cpptoolsconstants.h" #include "cpptoolsconstants.h"
#include "ui_cppcodemodelsettingspage.h" #include "ui_cppcodemodelsettingspage.h"
#include "ui_clazychecks.h"
#include "ui_tidychecks.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -86,79 +84,6 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets()
diagnosticConfigsModel, diagnosticConfigsModel,
m_settings->clangDiagnosticConfigId()); m_settings->clangDiagnosticConfigId());
m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget); m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget);
m_ui->clangPlugins->setEnabled(isClangActive);
setupPluginsWidgets();
}
void CppCodeModelSettingsWidget::setupPluginsWidgets()
{
m_clazyChecks.reset(new CppTools::Ui::ClazyChecks);
m_clazyChecksWidget = new QWidget();
m_clazyChecks->setupUi(m_clazyChecksWidget);
m_tidyChecks.reset(new CppTools::Ui::TidyChecks);
m_tidyChecksWidget = new QWidget();
m_tidyChecks->setupUi(m_tidyChecksWidget);
m_ui->pluginChecks->addTab(m_tidyChecksWidget, tr("ClangTidy"));
m_ui->pluginChecks->addTab(m_clazyChecksWidget, tr("Clazy"));
m_ui->pluginChecks->setCurrentIndex(0);
setupTidyChecks();
setupClazyChecks();
}
void CppCodeModelSettingsWidget::setupTidyChecks()
{
m_currentTidyChecks = m_settings->tidyChecks();
for (int row = 0; row < m_tidyChecks->checksList->count(); ++row) {
QListWidgetItem *item = m_tidyChecks->checksList->item(row);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
if (m_currentTidyChecks.indexOf(item->text()) != -1)
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
}
connect(m_tidyChecks->checksList, &QListWidget::itemChanged, [this](QListWidgetItem *item) {
const QString prefix = item->text();
item->checkState() == Qt::Checked
? m_currentTidyChecks.append(',' + prefix)
: m_currentTidyChecks.remove(',' + prefix);
});
}
void CppCodeModelSettingsWidget::setupClazyChecks()
{
// Levels descriptions are taken from https://github.com/KDE/clazy
static const std::array<QString, 5> levelDescriptions {{
QString(),
tr("Very stable checks, 99.99% safe, no false-positives."),
tr("Similar to level0, but sometimes (rarely) there might be\n"
"some false-positives."),
tr("Sometimes has false-positives (20-30%)."),
tr("Not always correct, possibly very noisy, might require\n"
"a knowledgeable developer to review, might have a very big\n"
"rate of false-positives, might have bugs.")
}};
m_currentClazyChecks = m_settings->clazyChecks();
if (!m_currentClazyChecks.isEmpty()) {
m_clazyChecks->clazyLevel->setCurrentText(m_currentClazyChecks);
const unsigned index = static_cast<unsigned>(m_clazyChecks->clazyLevel->currentIndex());
m_clazyChecks->levelDescription->setText(levelDescriptions[index]);
}
connect(m_clazyChecks->clazyLevel,
static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
[this](int index) {
m_clazyChecks->levelDescription->setText(levelDescriptions[static_cast<unsigned>(index)]);
if (index == 0) {
m_currentClazyChecks.clear();
return;
}
m_currentClazyChecks = m_clazyChecks->clazyLevel->itemText(index);
});
} }
void CppCodeModelSettingsWidget::setupGeneralWidgets() void CppCodeModelSettingsWidget::setupGeneralWidgets()
@@ -192,16 +117,6 @@ bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const
settingsChanged = true; settingsChanged = true;
} }
if (m_settings->tidyChecks() != m_currentTidyChecks) {
m_settings->setTidyChecks(m_currentTidyChecks);
settingsChanged = true;
}
if (m_settings->clazyChecks() != m_currentClazyChecks) {
m_settings->setClazyChecks(m_currentClazyChecks);
settingsChanged = true;
}
return settingsChanged; return settingsChanged;
} }

View File

@@ -32,8 +32,6 @@
#include <QPointer> #include <QPointer>
#include <QWidget> #include <QWidget>
#include <memory>
QT_FORWARD_DECLARE_CLASS(QComboBox) QT_FORWARD_DECLARE_CLASS(QComboBox)
QT_FORWARD_DECLARE_CLASS(QSettings) QT_FORWARD_DECLARE_CLASS(QSettings)
@@ -41,11 +39,6 @@ namespace CppTools {
class ClangDiagnosticConfigsWidget; class ClangDiagnosticConfigsWidget;
namespace Ui {
class ClazyChecks;
class TidyChecks;
} // namespace Ui
namespace Internal { namespace Internal {
namespace Ui { class CppCodeModelSettingsPage; } namespace Ui { class CppCodeModelSettingsPage; }
@@ -64,9 +57,6 @@ public:
private: private:
void setupGeneralWidgets(); void setupGeneralWidgets();
void setupClangCodeModelWidgets(); void setupClangCodeModelWidgets();
void setupPluginsWidgets();
void setupTidyChecks();
void setupClazyChecks();
bool applyGeneralWidgetsToSettings() const; bool applyGeneralWidgetsToSettings() const;
bool applyClangCodeModelWidgetsToSettings() const; bool applyClangCodeModelWidgetsToSettings() const;
@@ -75,14 +65,6 @@ private:
Ui::CppCodeModelSettingsPage *m_ui = nullptr; Ui::CppCodeModelSettingsPage *m_ui = nullptr;
QPointer<ClangDiagnosticConfigsWidget> m_clangDiagnosticConfigsWidget; QPointer<ClangDiagnosticConfigsWidget> m_clangDiagnosticConfigsWidget;
QSharedPointer<CppCodeModelSettings> m_settings; QSharedPointer<CppCodeModelSettings> m_settings;
std::unique_ptr<CppTools::Ui::ClazyChecks> m_clazyChecks;
QWidget *m_clazyChecksWidget = nullptr;
QString m_currentClazyChecks;
std::unique_ptr<CppTools::Ui::TidyChecks> m_tidyChecks;
QWidget *m_tidyChecksWidget = nullptr;
QString m_currentTidyChecks;
}; };
class CppCodeModelSettingsPage: public Core::IOptionsPage class CppCodeModelSettingsPage: public Core::IOptionsPage

View File

@@ -114,18 +114,6 @@
<layout class="QVBoxLayout" name="verticalLayout_3"/> <layout class="QVBoxLayout" name="verticalLayout_3"/>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="clangPlugins">
<property name="title">
<string>Clang Plugins</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTabWidget" name="pluginChecks"/>
</item>
</layout>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">

View File

@@ -56,8 +56,6 @@ const char CPPTOOLS_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[]
= "InterpretAmbiguousHeadersAsCHeaders"; = "InterpretAmbiguousHeadersAsCHeaders";
const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles";
const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit";
const char CPPTOOLS_TIDY_CHECKS[] = "TidyChecks";
const char CPPTOOLS_CLAZY_CHECKS[] = "ClazyChecks";
const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[]
= "Builtin.EverythingWithExceptions"; = "Builtin.EverythingWithExceptions";