diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-09-25 15:46:15 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-10-01 14:10:28 +0000 |
commit | b895dfa3821385311aa7b1be766195a3e586a283 (patch) | |
tree | 67b96cb788dbd617b2c1abbf9384ce85e849a06b /src/plugins/clangtools | |
parent | d2648db9140a6959b9eb269c5381ac8040c3f246 (diff) | |
download | qt-creator-b895dfa3821385311aa7b1be766195a3e586a283.tar.gz |
Clang/ClangTools: Separate custom diagnostic configs
Add a separate pool of custom diagnostic configs for the
ClangTools plugin. That is, the diagnostic configs in
Menu: Tools > C++ > Code Model
are not shared anymore with the configs at
Menu: Tools > Analyzer > ClangTools
On plugin initialization of ClangTools, move tidy/clazy related configs
to ClangTools.
Change-Id: Id06087a58b53e466a3d7bbac669550c5fbe9899d
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/clangtools')
19 files changed, 259 insertions, 60 deletions
diff --git a/src/plugins/clangtools/clangselectablefilesdialog.cpp b/src/plugins/clangtools/clangselectablefilesdialog.cpp index 6541ca46bc..418615f7da 100644 --- a/src/plugins/clangtools/clangselectablefilesdialog.cpp +++ b/src/plugins/clangtools/clangselectablefilesdialog.cpp @@ -32,7 +32,6 @@ #include "clangtoolsutils.h" #include <cpptools/compileroptionsbuilder.h> -#include <cpptools/cppcodemodelsettings.h> #include <cpptools/cppmodelmanager.h> #include <cpptools/cpptoolsreuse.h> #include <cpptools/projectinfo.h> diff --git a/src/plugins/clangtools/clangtidyclazyrunner.cpp b/src/plugins/clangtools/clangtidyclazyrunner.cpp index 21238a9f1c..bd909384d0 100644 --- a/src/plugins/clangtools/clangtidyclazyrunner.cpp +++ b/src/plugins/clangtools/clangtidyclazyrunner.cpp @@ -30,8 +30,8 @@ #include <coreplugin/icore.h> +#include <cpptools/clangdiagnosticconfigsmodel.h> #include <cpptools/compileroptionsbuilder.h> -#include <cpptools/cppcodemodelsettings.h> #include <cpptools/cpptoolsreuse.h> #include <utils/synchronousprocess.h> diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 3e4b3268d7..90c66834ac 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -44,6 +44,7 @@ #include <coreplugin/icore.h> #include <coreplugin/messagebox.h> +#include <cpptools/clangdiagnosticconfigsmodel.h> #include <cpptools/cppmodelmanager.h> #include <debugger/analyzer/analyzermanager.h> @@ -248,6 +249,13 @@ static RunSettings runSettings() return projectSettings->runSettings(); } +static ClangDiagnosticConfig diagnosticConfig(const Core::Id &diagConfigId) +{ + const ClangDiagnosticConfigsModel configs = diagnosticConfigsModel(); + QTC_ASSERT(configs.hasConfigWithId(diagConfigId), return ClangDiagnosticConfig()); + return configs.configWithId(diagConfigId); +} + ClangTool *ClangTool::instance() { return s_instance; @@ -440,10 +448,13 @@ void ClangTool::selectPerspective() void ClangTool::startTool(ClangTool::FileSelection fileSelection) { - startTool(runSettings(), fileSelection); + const RunSettings theRunSettings = runSettings(); + startTool(fileSelection, theRunSettings, diagnosticConfig(theRunSettings.diagnosticConfigId())); } -void ClangTool::startTool(const RunSettings &runSettings, ClangTool::FileSelection fileSelection) +void ClangTool::startTool(ClangTool::FileSelection fileSelection, + const RunSettings &runSettings, + const CppTools::ClangDiagnosticConfig &diagnosticConfig) { Project *project = SessionManager::startupProject(); QTC_ASSERT(project, return); @@ -459,7 +470,11 @@ void ClangTool::startTool(const RunSettings &runSettings, ClangTool::FileSelecti return; const bool preventBuild = fileSelection == FileSelection::CurrentFile; - auto clangTool = new ClangToolRunWorker(runControl, runSettings, fileInfos, preventBuild); + auto clangTool = new ClangToolRunWorker(runControl, + runSettings, + diagnosticConfig, + fileInfos, + preventBuild); m_stopAction->disconnect(); connect(m_stopAction, &QAction::triggered, runControl, [runControl] { diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 8fb6140008..422c24ff95 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -38,6 +38,9 @@ QT_BEGIN_NAMESPACE class QToolButton; QT_END_NAMESPACE +namespace CppTools { +class ClangDiagnosticConfig; +} namespace Debugger { class DetailedErrorView; } @@ -74,7 +77,9 @@ public: AskUser, }; void startTool(FileSelection fileSelection); - void startTool(const RunSettings &runSettings, FileSelection fileSelection); + void startTool(FileSelection fileSelection, + const RunSettings &runSettings, + const CppTools::ClangDiagnosticConfig &diagnosticConfig); Diagnostics read(OutputFileFormat outputFileFormat, const QString &logFilePath, diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 2af11aa7ef..307e2c7e04 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -42,7 +42,6 @@ #include <cpptools/clangdiagnosticconfigsmodel.h> #include <cpptools/compileroptionsbuilder.h> -#include <cpptools/cppcodemodelsettings.h> #include <cpptools/cppmodelmanager.h> #include <cpptools/cppprojectfile.h> #include <cpptools/cpptoolsreuse.h> @@ -221,21 +220,14 @@ static QDebug operator<<(QDebug debug, const AnalyzeUnits &analyzeUnits) return debug; } -static ClangDiagnosticConfig diagnosticConfig(const Core::Id &diagConfigId) -{ - const ClangDiagnosticConfigsModel configsModel( - CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); - - QTC_ASSERT(configsModel.hasConfigWithId(diagConfigId), return ClangDiagnosticConfig()); - return configsModel.configWithId(diagConfigId); -} ClangToolRunWorker::ClangToolRunWorker(RunControl *runControl, const RunSettings &runSettings, + const CppTools::ClangDiagnosticConfig &diagnosticConfig, const FileInfos &fileInfos, bool preventBuild) : RunWorker(runControl) - , m_diagnosticConfig(diagnosticConfig(runSettings.diagnosticConfigId())) + , m_diagnosticConfig(diagnosticConfig) , m_fileInfos(fileInfos) , m_temporaryDir("clangtools-XXXXXX") { diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index bfada9e502..d1c97c206c 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -68,6 +68,7 @@ class ClangToolRunWorker : public ProjectExplorer::RunWorker public: ClangToolRunWorker(ProjectExplorer::RunControl *runControl, const RunSettings &runSettings, + const CppTools::ClangDiagnosticConfig &diagnosticConfig, const FileInfos &fileInfos, bool preventBuild); diff --git a/src/plugins/clangtools/clangtoolsconstants.h b/src/plugins/clangtools/clangtoolsconstants.h index f19ffc068a..a3da1d78f5 100644 --- a/src/plugins/clangtools/clangtoolsconstants.h +++ b/src/plugins/clangtools/clangtoolsconstants.h @@ -38,5 +38,7 @@ const char CLANGTIDYCLAZY_RUN_MODE[] = "ClangTidyClazy.RunMode"; const char CLANG_TIDY_EXECUTABLE_NAME[] = "clang-tidy"; const char CLAZY_STANDALONE_EXECUTABLE_NAME[] = "clazy-standalone"; +const char DIAG_CONFIG_TIDY_AND_CLAZY[] = "Builtin.TidyAndClazy"; + } // Constants } // ClangTools diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index 12031dc589..cdcda4d3c6 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -113,6 +113,10 @@ bool ClangToolsPlugin::initialize(const QStringList &arguments, QString *errorSt Q_UNUSED(arguments) Q_UNUSED(errorString) + // Import tidy/clazy diagnostic configs from CppTools now + // instead of at opening time of the settings page + ClangToolsSettings::instance(); + d = new ClangToolsPluginPrivate; ActionManager::registerAction(d->clangTool.startAction(), Constants::RUN_ON_PROJECT); diff --git a/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp b/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp index b76f5eefee..2ed19354f2 100644 --- a/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp +++ b/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp @@ -27,7 +27,6 @@ #include "clangtool.h" #include "clangtoolsdiagnostic.h" -#include "clangtoolssettings.h" #include "clangtoolsutils.h" #include <coreplugin/icore.h> @@ -122,8 +121,7 @@ void PreconfiguredSessionTests::testPreconfiguredSession() QVERIFY(switchToProjectAndTarget(project, target)); - ClangTool::instance()->startTool(ClangToolsSettings::instance()->runSettings(), - ClangTool::FileSelection::AllFiles); + ClangTool::instance()->startTool(ClangTool::FileSelection::AllFiles); QSignalSpy waitUntilAnalyzerFinished(ClangTool::instance(), SIGNAL(finished(bool))); QVERIFY(waitUntilAnalyzerFinished.wait(30000)); const QList<QVariant> arguments = waitUntilAnalyzerFinished.takeFirst(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp index c5b7c53a68..15a86e9d32 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp @@ -29,6 +29,7 @@ #include "clangtool.h" #include "clangtoolsconstants.h" #include "clangtoolsprojectsettings.h" +#include "clangtoolsutils.h" #include <coreplugin/icore.h> @@ -36,6 +37,8 @@ #include <QAbstractTableModel> +#include <cpptools/clangdiagnosticconfigsmodel.h> + namespace ClangTools { namespace Internal { @@ -98,6 +101,25 @@ ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, connect(m_ui->runSettingsWidget, &RunSettingsWidget::changed, [this]() { m_projectSettings->setRunSettings(m_ui->runSettingsWidget->toSettings()); }); + connect(m_ui->runSettingsWidget, + &RunSettingsWidget::diagnosticConfigsEdited, + this, + [this](const CppTools::ClangDiagnosticConfigs &configs) { + const CppTools::ClangDiagnosticConfigsModel configsModel = diagnosticConfigsModel( + configs); + RunSettings runSettings = m_projectSettings->runSettings(); + if (!configsModel.hasConfigWithId(runSettings.diagnosticConfigId())) { + runSettings.resetDiagnosticConfigId(); + m_projectSettings->setRunSettings(runSettings); + } + ClangToolsSettings::instance()->setDiagnosticConfigs(configs); + ClangToolsSettings::instance()->writeSettings(); + m_ui->runSettingsWidget->fromSettings(runSettings); + }); + connect(ClangToolsSettings::instance(), &ClangToolsSettings::changed, + this, [this](){ + m_ui->runSettingsWidget->fromSettings(m_projectSettings->runSettings()); + }); // Suppressed diagnostics auto * const model = new SuppressedDiagnosticsModel(this); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h index 680431cc6e..a014dd804e 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h @@ -51,8 +51,8 @@ private: void updateButtonStateRemoveAll(); void removeSelected(); - Ui::ProjectSettingsWidget * const m_ui; - ClangToolsProjectSettings * const m_projectSettings; + Ui::ProjectSettingsWidget *const m_ui; + ClangToolsProjectSettings *const m_projectSettings; }; } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolssettings.cpp b/src/plugins/clangtools/clangtoolssettings.cpp index 07b9592a8e..2e71d3cf62 100644 --- a/src/plugins/clangtools/clangtoolssettings.cpp +++ b/src/plugins/clangtools/clangtoolssettings.cpp @@ -28,6 +28,11 @@ #include "clangtoolsconstants.h" #include <coreplugin/icore.h> +#include <cpptools/clangdiagnosticconfig.h> +#include <cpptools/cppcodemodelsettings.h> +#include <cpptools/cpptoolsreuse.h> + +#include <utils/algorithm.h> #include <QThread> @@ -39,11 +44,19 @@ static const char buildBeforeAnalysisKey[] = "BuildBeforeAnalysis"; static const char oldDiagnosticConfigIdKey[] = "diagnosticConfigId"; +using namespace CppTools; + namespace ClangTools { namespace Internal { +static Core::Id defaultDiagnosticId() +{ + return ClangTools::Constants::DIAG_CONFIG_TIDY_AND_CLAZY; +} + RunSettings::RunSettings() - : m_parallelJobs(qMax(0, QThread::idealThreadCount() / 2)) + : m_diagnosticConfigId(defaultDiagnosticId()) + , m_parallelJobs(qMax(0, QThread::idealThreadCount() / 2)) { } @@ -61,6 +74,11 @@ void RunSettings::toMap(QVariantMap &map, const QString &prefix) const map.insert(prefix + buildBeforeAnalysisKey, m_buildBeforeAnalysis); } +void RunSettings::resetDiagnosticConfigId() +{ + m_diagnosticConfigId = defaultDiagnosticId(); +} + ClangToolsSettings::ClangToolsSettings() { readSettings(); @@ -89,14 +107,40 @@ static QVariantMap convertToMapFromVersionBefore410(QSettings *s) return map; } +ClangDiagnosticConfigs importDiagnosticConfigsFromCodeModel() +{ + const ClangDiagnosticConfigs configs = codeModelSettings()->clangCustomDiagnosticConfigs(); + + ClangDiagnosticConfigs tidyClazyConfigs; + ClangDiagnosticConfigs clangOnlyConfigs; + std::tie(tidyClazyConfigs, clangOnlyConfigs) + = Utils::partition(configs, [](const ClangDiagnosticConfig &config) { + return !config.clazyChecks().isEmpty() + || config.clangTidyMode() != ClangDiagnosticConfig::TidyMode::Disabled; + }); + + if (!tidyClazyConfigs.isEmpty()) { + codeModelSettings()->setClangCustomDiagnosticConfigs(clangOnlyConfigs); + codeModelSettings()->toSettings(Core::ICore::settings()); + } + + return tidyClazyConfigs; +} + void ClangToolsSettings::readSettings() { + // Transfer tidy/clazy configs from code model + bool write = false; + ClangDiagnosticConfigs importedConfigs = importDiagnosticConfigsFromCodeModel(); + m_diagnosticConfigs.append(importedConfigs); + if (!importedConfigs.isEmpty()) + write = true; + QSettings *s = Core::ICore::settings(); s->beginGroup(Constants::SETTINGS_ID); m_clangTidyExecutable = s->value(clangTidyExecutableKey).toString(); m_clazyStandaloneExecutable = s->value(clazyStandaloneExecutableKey).toString(); - - bool write = false; + m_diagnosticConfigs.append(diagnosticConfigsFromSettings(s)); QVariantMap map; if (!s->value(oldDiagnosticConfigIdKey).isNull()) { @@ -128,6 +172,7 @@ void ClangToolsSettings::writeSettings() s->setValue(clangTidyExecutableKey, m_clangTidyExecutable); s->setValue(clazyStandaloneExecutableKey, m_clazyStandaloneExecutable); + diagnosticConfigsToSettings(s, m_diagnosticConfigs); QVariantMap map; m_runSettings.toMap(map); @@ -135,6 +180,8 @@ void ClangToolsSettings::writeSettings() s->setValue(it.key(), it.value()); s->endGroup(); + + emit changed(); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolssettings.h b/src/plugins/clangtools/clangtoolssettings.h index 893dbd23f9..36da00d293 100644 --- a/src/plugins/clangtools/clangtoolssettings.h +++ b/src/plugins/clangtools/clangtoolssettings.h @@ -26,7 +26,9 @@ #pragma once #include <coreplugin/id.h> +#include <cpptools/clangdiagnosticconfig.h> +#include <QObject> #include <QString> namespace ClangTools { @@ -44,6 +46,7 @@ public: Core::Id diagnosticConfigId() const { return m_diagnosticConfigId; } void setDiagnosticConfigId(const Core::Id &id) { m_diagnosticConfigId = id; } + void resetDiagnosticConfigId(); bool buildBeforeAnalysis() const { return m_buildBeforeAnalysis; } void setBuildBeforeAnalysis(bool yesno) { m_buildBeforeAnalysis = yesno; } @@ -52,13 +55,15 @@ public: void setParallelJobs(int jobs) { m_parallelJobs = jobs; } private: - Core::Id m_diagnosticConfigId = "Builtin.TidyAndClazy"; // TODO + Core::Id m_diagnosticConfigId; int m_parallelJobs = -1; bool m_buildBeforeAnalysis = true; }; -class ClangToolsSettings +class ClangToolsSettings : public QObject { + Q_OBJECT + public: static ClangToolsSettings *instance(); void writeSettings(); @@ -69,9 +74,16 @@ public: QString clazyStandaloneExecutable() const { return m_clazyStandaloneExecutable; } void setClazyStandaloneExecutable(const QString &path) { m_clazyStandaloneExecutable = path; } + CppTools::ClangDiagnosticConfigs diagnosticConfigs() const { return m_diagnosticConfigs; } + void setDiagnosticConfigs(const CppTools::ClangDiagnosticConfigs &configs) + { m_diagnosticConfigs = configs; } + RunSettings runSettings() const { return m_runSettings; } void setRunSettings(const RunSettings &settings) { m_runSettings = settings; } +signals: + void changed(); + private: ClangToolsSettings(); void readSettings(); @@ -80,6 +92,9 @@ private: QString m_clangTidyExecutable; QString m_clazyStandaloneExecutable; + // Diagnostic Configs + CppTools::ClangDiagnosticConfigs m_diagnosticConfigs; + // Run settings RunSettings m_runSettings; }; diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index d0a48f4bc9..609d666ed5 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -31,10 +31,10 @@ #include "clangtoolsutils.h" #include <coreplugin/icore.h> -#include <cpptools/cppcodemodelsettings.h> +#include <cpptools/clangdiagnosticconfig.h> #include <cpptools/cppmodelmanager.h> -#include <cpptools/cpptoolstestcase.h> #include <cpptools/cpptoolsreuse.h> +#include <cpptools/cpptoolstestcase.h> #include <projectexplorer/kitinformation.h> #include <projectexplorer/kitmanager.h> #include <projectexplorer/projectexplorer.h> @@ -62,8 +62,8 @@ void ClangToolsUnitTests::initTestCase() const QList<Kit *> allKits = KitManager::kits(); if (allKits.count() != 1) QSKIP("This test requires exactly one kit to be present"); - const ToolChain * const toolchain = ToolChainKitAspect::toolChain(allKits.first(), - Constants::CXX_LANGUAGE_ID); + const ToolChain *const toolchain = ToolChainKitAspect::toolChain(allKits.first(), + Constants::CXX_LANGUAGE_ID); if (!toolchain) QSKIP("This test requires that there is a kit with a toolchain."); @@ -110,25 +110,11 @@ void ClangToolsUnitTests::testProject() Tests::ProjectOpenerAndCloser projectManager; const ProjectInfo projectInfo = projectManager.open(projectFilePath, true); QVERIFY(projectInfo.isValid()); - ClangTool *tool = ClangTool::instance(); - - // Change configs - QSharedPointer<CppCodeModelSettings> cppToolsSettings = codeModelSettings(); - ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance(); - const ClangDiagnosticConfigs originalConfigs = cppToolsSettings->clangCustomDiagnosticConfigs(); - ClangDiagnosticConfigs modifiedConfigs = originalConfigs; - modifiedConfigs.push_back(diagnosticConfig); - - ExecuteOnDestruction restoreCustomConfigs([=]() { - cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs); - }); - - cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs); - RunSettings runSettings = clangToolsSettings->runSettings(); - runSettings.setDiagnosticConfigId(diagnosticConfig.id()); - - tool->startTool(runSettings, ClangTool::FileSelection::AllFiles); + ClangTool *tool = ClangTool::instance(); + tool->startTool(ClangTool::FileSelection::AllFiles, + ClangToolsSettings::instance()->runSettings(), + diagnosticConfig); QSignalSpy waiter(tool, SIGNAL(finished(bool))); QVERIFY(waiter.wait(30000)); diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp index acb87f5ec1..4d3c106cc7 100644 --- a/src/plugins/clangtools/clangtoolsutils.cpp +++ b/src/plugins/clangtools/clangtoolsutils.cpp @@ -31,7 +31,7 @@ #include "clangtoolssettings.h" #include <coreplugin/icore.h> - +#include <cpptools/cpptoolsreuse.h> #include <projectexplorer/projectexplorerconstants.h> #include <utils/checkablemessagebox.h> @@ -39,9 +39,12 @@ #include <utils/hostosinfo.h> #include <utils/synchronousprocess.h> -#include <QCoreApplication> #include <QFileInfo> -#include <QRegularExpression> + +#include <cpptools/clangdiagnosticconfigsmodel.h> +#include <cpptools/clangdiagnosticconfigsmodel.h> + +using namespace CppTools; namespace ClangTools { namespace Internal { @@ -151,7 +154,83 @@ QString clazyStandaloneExecutable() shippedClazyStandaloneExecutable(), qEnvironmentVariable("QTC_USE_CLAZY_STANDALONE_PATH"), Constants::CLAZY_STANDALONE_EXECUTABLE_NAME, + }); +} + +constexpr const char *DEFAULT_TIDY_CHECKS = "-*," + "bugprone-*," + "cppcoreguidelines-*," + "misc-*," + "modernize-*," + "performance-*," + "readability-*," + "-cppcoreguidelines-owning-memory," + "-readability-braces-around-statements," + "-readability-implicit-bool-conversion," + "-readability-named-parameter"; + +static void addBuiltinConfigs(ClangDiagnosticConfigsModel &model) +{ + // Clang-Tidy + ClangDiagnosticConfig config; + config.setId("Builtin.Tidy"); + config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", + "Clang-Tidy thorough checks")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{QStringLiteral("-w")}); + config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::ChecksPrefixList); + config.setClangTidyChecks(QString::fromUtf8(DEFAULT_TIDY_CHECKS)); + model.appendOrUpdate(config); + + // Clang static analyzer + config = ClangDiagnosticConfig(); + config.setId("Builtin.TidyClangAnalyze"); + config.setDisplayName(QCoreApplication::translate( + "ClangDiagnosticConfigsModel", + "Clang-Tidy static analyzer checks")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{ + QStringLiteral("-w"), }); + config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::ChecksPrefixList); + config.setClangTidyChecks("-*,clang-analyzer-*"); + model.appendOrUpdate(config); + + // Clazy + config = ClangDiagnosticConfig(); + config.setId("Builtin.Clazy"); + config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", + "Clazy level0 checks")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{QStringLiteral("-w")}); + config.setClazyChecks(CppTools::clazyChecksForLevel(0)); + model.appendOrUpdate(config); + + // Clang-Tidy and Clazy + config = ClangDiagnosticConfig(); + config.setId(Constants::DIAG_CONFIG_TIDY_AND_CLAZY); + config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", + "Clang-Tidy and Clazy preselected checks")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{QStringLiteral("-w")}); + config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::ChecksPrefixList); + config.setClangTidyChecks(QString::fromUtf8(DEFAULT_TIDY_CHECKS)); + config.setClazyChecks(clazyChecksForLevel(0)); + model.appendOrUpdate(config); +} + +ClangDiagnosticConfigsModel diagnosticConfigsModel(const ClangDiagnosticConfigs &customConfigs) +{ + ClangDiagnosticConfigsModel model; + addBuiltinConfigs(model); + for (const ClangDiagnosticConfig &config : customConfigs) + model.appendOrUpdate(config); + return model; +} + +ClangDiagnosticConfigsModel diagnosticConfigsModel() +{ + return Internal::diagnosticConfigsModel(ClangToolsSettings::instance()->diagnosticConfigs()); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolsutils.h b/src/plugins/clangtools/clangtoolsutils.h index a7ae9620de..d0b4829725 100644 --- a/src/plugins/clangtools/clangtoolsutils.h +++ b/src/plugins/clangtools/clangtoolsutils.h @@ -26,6 +26,7 @@ #pragma once #include <coreplugin/id.h> +#include <cpptools/clangdiagnosticconfig.h> #include <QVersionNumber> #include <QtGlobal> @@ -34,6 +35,7 @@ QT_BEGIN_NAMESPACE class QString; QT_END_NAMESPACE +namespace CppTools { class ClangDiagnosticConfigsModel; } namespace Debugger { class DiagnosticLocation; } namespace ClangTools { @@ -52,5 +54,9 @@ QString clazyStandaloneExecutable(); QString shippedClangTidyExecutable(); QString clangTidyExecutable(); +CppTools::ClangDiagnosticConfigsModel diagnosticConfigsModel(); +CppTools::ClangDiagnosticConfigsModel diagnosticConfigsModel( + const CppTools::ClangDiagnosticConfigs &customConfigs); + } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/runsettingswidget.cpp b/src/plugins/clangtools/runsettingswidget.cpp index 1a26d2e7d0..381d29ea19 100644 --- a/src/plugins/clangtools/runsettingswidget.cpp +++ b/src/plugins/clangtools/runsettingswidget.cpp @@ -40,14 +40,6 @@ RunSettingsWidget::RunSettingsWidget(QWidget *parent) , m_ui(new Ui::RunSettingsWidget) { m_ui->setupUi(this); - - connect(m_ui->diagnosticWidget, - &CppTools::ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, - [this](const Core::Id &) { emit changed(); }); - // m_ui->buildBeforeAnalysis is handled in fromSettings() - connect(m_ui->parallelJobsSpinBox, - QOverload<int>::of(&QSpinBox::valueChanged), - [this](int) { emit changed(); }); } RunSettingsWidget::~RunSettingsWidget() @@ -57,7 +49,17 @@ RunSettingsWidget::~RunSettingsWidget() void RunSettingsWidget::fromSettings(const RunSettings &s) { - m_ui->diagnosticWidget->refresh(s.diagnosticConfigId()); + disconnect(m_ui->diagnosticWidget, 0, 0, 0); + m_ui->diagnosticWidget->refresh(diagnosticConfigsModel(), + s.diagnosticConfigId(), + /*showTidyClazyUi=*/true); + connect(m_ui->diagnosticWidget, + &CppTools::ClangDiagnosticConfigsSelectionWidget::diagnosticConfigsEdited, + this, + &RunSettingsWidget::diagnosticConfigsEdited); + connect(m_ui->diagnosticWidget, + &CppTools::ClangDiagnosticConfigsSelectionWidget::currentConfigChanged, + [this](const Core::Id &) { emit changed(); }); disconnect(m_ui->buildBeforeAnalysis, 0, 0, 0); m_ui->buildBeforeAnalysis->setToolTip(hintAboutBuildBeforeAnalysis()); @@ -68,9 +70,13 @@ void RunSettingsWidget::fromSettings(const RunSettings &s) emit changed(); }); + disconnect(m_ui->parallelJobsSpinBox, 0, 0, 0); m_ui->parallelJobsSpinBox->setValue(s.parallelJobs()); m_ui->parallelJobsSpinBox->setMinimum(1); m_ui->parallelJobsSpinBox->setMaximum(QThread::idealThreadCount()); + connect(m_ui->parallelJobsSpinBox, + QOverload<int>::of(&QSpinBox::valueChanged), + [this](int) { emit changed(); }); } RunSettings RunSettingsWidget::toSettings() const diff --git a/src/plugins/clangtools/runsettingswidget.h b/src/plugins/clangtools/runsettingswidget.h index c49bc88f75..615348c38a 100644 --- a/src/plugins/clangtools/runsettingswidget.h +++ b/src/plugins/clangtools/runsettingswidget.h @@ -25,6 +25,8 @@ #pragma once +#include <cpptools/clangdiagnosticconfig.h> + #include <QWidget> namespace ClangTools { @@ -48,6 +50,7 @@ public: RunSettings toSettings() const; signals: + void diagnosticConfigsEdited(const CppTools::ClangDiagnosticConfigs &configs); void changed(); private: diff --git a/src/plugins/clangtools/settingswidget.cpp b/src/plugins/clangtools/settingswidget.cpp index 110135a779..ba619b9f45 100644 --- a/src/plugins/clangtools/settingswidget.cpp +++ b/src/plugins/clangtools/settingswidget.cpp @@ -30,6 +30,10 @@ #include "clangtoolsconstants.h" #include "clangtoolsutils.h" +#include <cpptools/clangdiagnosticconfigsmodel.h> + +#include <utils/optional.h> + namespace ClangTools { namespace Internal { @@ -101,6 +105,21 @@ SettingsWidget::SettingsWidget(ClangToolsSettings *settings, QWidget *parent) // m_ui->runSettingsWidget->fromSettings(m_settings->runSettings()); + connect(m_ui->runSettingsWidget, + &RunSettingsWidget::diagnosticConfigsEdited, + this, + [this](const CppTools::ClangDiagnosticConfigs &configs) { + const CppTools::ClangDiagnosticConfigsModel configsModel = diagnosticConfigsModel( + configs); + RunSettings runSettings = m_settings->runSettings(); + if (!configsModel.hasConfigWithId(m_settings->runSettings().diagnosticConfigId())) { + runSettings.resetDiagnosticConfigId(); + m_settings->setRunSettings(runSettings); + } + m_settings->setDiagnosticConfigs(configs); + m_settings->writeSettings(); + m_ui->runSettingsWidget->fromSettings(runSettings); + }); } void SettingsWidget::apply() |