forked from qt-creator/qt-creator
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:
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ¤tConfig() const;
|
const ClangDiagnosticConfig ¤tConfig() 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
|
||||||
|
|||||||
@@ -93,6 +93,9 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="pluginChecksTabs"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
Reference in New Issue
Block a user