From 092bdbc0a18b18419256befb3e92368c74828142 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 27 Sep 2019 13:50:40 +0200 Subject: [PATCH] Clang: Reduce built-in diagnostic configs Change-Id: Ieb7c712916f0b3ddd08b04cccf97fc0fa1f828d4 Reviewed-by: Cristian Adam Reviewed-by: Nikolai Kosjar --- src/plugins/cpptools/cppcodemodelsettings.cpp | 75 +++++++++++++++++-- src/plugins/cpptools/cpptoolsconstants.h | 3 +- src/plugins/cpptools/cpptoolsreuse.cpp | 41 ++-------- 3 files changed, 75 insertions(+), 44 deletions(-) diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index 244480c81bc..a4fe8fd0886 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -29,6 +29,7 @@ #include "cpptoolsconstants.h" #include "cpptoolsreuse.h" +#include #include #include @@ -36,7 +37,7 @@ using namespace CppTools; static Core::Id initialClangDiagnosticConfigId() -{ return {Constants::CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS}; } +{ return Constants::CPP_CLANG_DIAG_CONFIG_QUESTIONABLE; } static CppCodeModelSettings::PCHUsage initialPchUsage() { return CppCodeModelSettings::PchUse_BuildSystem; } @@ -67,6 +68,56 @@ static Core::Id clangDiagnosticConfigIdFromSettings(QSettings *s) s->value(clangDiagnosticConfigKey(), initialClangDiagnosticConfigId().toSetting())); } +// Removed since Qt Creator 4.11 +static ClangDiagnosticConfigs removedBuiltinConfigs() +{ + ClangDiagnosticConfigs configs; + + // Pedantic + ClangDiagnosticConfig config; + config.setId("Builtin.Pedantic"); + config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", + "Pedantic checks")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{QStringLiteral("-Wpedantic")}); + configs << config; + + // Everything with exceptions + config = ClangDiagnosticConfig(); + config.setId("Builtin.EverythingWithExceptions"); + config.setDisplayName(QCoreApplication::translate( + "ClangDiagnosticConfigsModel", + "Checks for almost everything")); + config.setIsReadOnly(true); + config.setClangOptions(QStringList{ + QStringLiteral("-Weverything"), + QStringLiteral("-Wno-c++98-compat"), + QStringLiteral("-Wno-c++98-compat-pedantic"), + QStringLiteral("-Wno-unused-macros"), + QStringLiteral("-Wno-newline-eof"), + QStringLiteral("-Wno-exit-time-destructors"), + QStringLiteral("-Wno-global-constructors"), + QStringLiteral("-Wno-gnu-zero-variadic-macro-arguments"), + QStringLiteral("-Wno-documentation"), + QStringLiteral("-Wno-shadow"), + QStringLiteral("-Wno-switch-enum"), + QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects. + QStringLiteral("-Wno-used-but-marked-unused"), // e.g. QTest::qWait + }); + configs << config; + + return configs; +} + +static ClangDiagnosticConfig convertToCustomConfig(const Core::Id &id) +{ + const ClangDiagnosticConfig config + = Utils::findOrDefault(removedBuiltinConfigs(), [id](const ClangDiagnosticConfig &config) { + return config.id() == id; + }); + return ClangDiagnosticConfigsModel::createCustomConfig(config, config.displayName()); +} + void CppCodeModelSettings::fromSettings(QSettings *s) { s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); @@ -74,13 +125,22 @@ void CppCodeModelSettings::fromSettings(QSettings *s) setClangCustomDiagnosticConfigs(diagnosticConfigsFromSettings(s)); setClangDiagnosticConfigId(clangDiagnosticConfigIdFromSettings(s)); - { // Before Qt Creator 4.8, inconsistent settings might have been written. - const ClangDiagnosticConfigsModel model = diagnosticConfigsModel( - m_clangCustomDiagnosticConfigs); - if (!model.hasConfigWithId(m_clangDiagnosticConfigId)) - setClangDiagnosticConfigId(initialClangDiagnosticConfigId()); + // Qt Creator 4.11 removes some built-in configs. + bool write = false; + const Core::Id id = m_clangDiagnosticConfigId; + if (id == "Builtin.Pedantic" || id == "Builtin.EverythingWithExceptions") { + // If one of them was used, continue to use it, but convert it to a custom config. + const ClangDiagnosticConfig customConfig = convertToCustomConfig(id); + m_clangCustomDiagnosticConfigs.append(customConfig); + m_clangDiagnosticConfigId = customConfig.id(); + write = true; } + // Before Qt Creator 4.8, inconsistent settings might have been written. + const ClangDiagnosticConfigsModel model = diagnosticConfigsModel(m_clangCustomDiagnosticConfigs); + if (!model.hasConfigWithId(m_clangDiagnosticConfigId)) + setClangDiagnosticConfigId(initialClangDiagnosticConfigId()); + setEnableLowerClazyLevels(s->value(enableLowerClazyLevelsKey(), true).toBool()); const QVariant pchUsageVariant = s->value(pchUsageKey(), initialPchUsage()); @@ -98,6 +158,9 @@ void CppCodeModelSettings::fromSettings(QSettings *s) s->endGroup(); + if (write) + toSettings(s); + emit changed(); } diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index f62a06dee21..33667b2ce8f 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -58,8 +58,7 @@ const char CPPTOOLS_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[] const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; -const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] - = "Builtin.EverythingWithExceptions"; +const char CPP_CLANG_DIAG_CONFIG_QUESTIONABLE[] = "Builtin.Questionable"; const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style"; const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style"); diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp index bf37098f889..b8677256916 100644 --- a/src/plugins/cpptools/cpptoolsreuse.cpp +++ b/src/plugins/cpptools/cpptoolsreuse.cpp @@ -354,53 +354,22 @@ QString clazyChecksForLevel(int level) static void addBuiltinConfigs(ClangDiagnosticConfigsModel &model) { - // Pedantic ClangDiagnosticConfig config; - config.setId("Builtin.Pedantic"); - config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", - "Pedantic checks")); - config.setIsReadOnly(true); - config.setClangOptions(QStringList{QStringLiteral("-Wpedantic")}); - model.appendOrUpdate(config); // Questionable constructs config = ClangDiagnosticConfig(); - config.setId("Builtin.Questionable"); + config.setId(Constants::CPP_CLANG_DIAG_CONFIG_QUESTIONABLE); config.setDisplayName(QCoreApplication::translate( "ClangDiagnosticConfigsModel", "Checks for questionable constructs")); config.setIsReadOnly(true); - config.setClangOptions(QStringList{ - QStringLiteral("-Wall"), - QStringLiteral("-Wextra"), + config.setClangOptions({ + "-Wall", + "-Wextra", }); model.appendOrUpdate(config); - // Everything with exceptions - config = ClangDiagnosticConfig(); - config.setId(Constants::CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS); - config.setDisplayName(QCoreApplication::translate( - "ClangDiagnosticConfigsModel", - "Checks for almost everything")); - config.setIsReadOnly(true); - config.setClangOptions(QStringList{ - QStringLiteral("-Weverything"), - QStringLiteral("-Wno-c++98-compat"), - QStringLiteral("-Wno-c++98-compat-pedantic"), - QStringLiteral("-Wno-unused-macros"), - QStringLiteral("-Wno-newline-eof"), - QStringLiteral("-Wno-exit-time-destructors"), - QStringLiteral("-Wno-global-constructors"), - QStringLiteral("-Wno-gnu-zero-variadic-macro-arguments"), - QStringLiteral("-Wno-documentation"), - QStringLiteral("-Wno-shadow"), - QStringLiteral("-Wno-switch-enum"), - QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects. - QStringLiteral("-Wno-used-but-marked-unused"), // e.g. QTest::qWait - }); - model.appendOrUpdate(config); - - // Build system + // Warning flags from build system config = ClangDiagnosticConfig(); config.setId("Builtin.BuildSystem"); config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel",