diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-01-19 13:18:43 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-01-29 08:13:44 +0000 |
commit | 9b4688f1a4e88344b9a86abc58373b9e4c3ea9f8 (patch) | |
tree | 07c320bebebc8f030d868944d78313a3dde2e5dc | |
parent | 5b6b26893fe6bd244fa18a77852413523392c7b2 (diff) | |
download | qt-creator-9b4688f1a4e88344b9a86abc58373b9e4c3ea9f8.tar.gz |
Clang: Let CppCodeModelSettings announce invalidated diagnostic configs
Change-Id: I1fe62d4cd4bc91bfd73e57ace6dc9a87d13b3537
Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r-- | src/plugins/cpptools/clangdiagnosticconfig.cpp | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/clangdiagnosticconfig.h | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp | 17 | ||||
-rw-r--r-- | src/plugins/cpptools/clangdiagnosticconfigsmodel.h | 8 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.cpp | 41 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.h | 1 |
6 files changed, 63 insertions, 10 deletions
diff --git a/src/plugins/cpptools/clangdiagnosticconfig.cpp b/src/plugins/cpptools/clangdiagnosticconfig.cpp index 89cc76442a..55b85f59b8 100644 --- a/src/plugins/cpptools/clangdiagnosticconfig.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfig.cpp @@ -75,4 +75,9 @@ bool ClangDiagnosticConfig::operator==(const ClangDiagnosticConfig &other) const && m_isReadOnly == other.m_isReadOnly; } +bool ClangDiagnosticConfig::operator!=(const ClangDiagnosticConfig &other) const +{ + return !(*this == other); +} + } // namespace CppTools diff --git a/src/plugins/cpptools/clangdiagnosticconfig.h b/src/plugins/cpptools/clangdiagnosticconfig.h index b9efb040b0..e2329a2054 100644 --- a/src/plugins/cpptools/clangdiagnosticconfig.h +++ b/src/plugins/cpptools/clangdiagnosticconfig.h @@ -50,6 +50,7 @@ public: void setIsReadOnly(bool isReadOnly); bool operator==(const ClangDiagnosticConfig &other) const; + bool operator!=(const ClangDiagnosticConfig &other) const; private: Core::Id m_id; diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 206a0d8baa..0fff8ac7ac 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -158,6 +158,23 @@ ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(const ClangDiagnos : config.displayName(); } +QVector<Core::Id> ClangDiagnosticConfigsModel::changedOrRemovedConfigs( + const ClangDiagnosticConfigs &oldConfigs, const ClangDiagnosticConfigs &newConfigs) +{ + ClangDiagnosticConfigsModel newConfigsModel(newConfigs); + QVector<Core::Id> changedConfigs; + + for (const ClangDiagnosticConfig &old: oldConfigs) { + const int i = newConfigsModel.indexOfConfig(old.id()); + if (i == -1) + changedConfigs.append(old.id()); // Removed + else if (newConfigsModel.configs()[i] != old) + changedConfigs.append(old.id()); // Changed + } + + return changedConfigs; +} + int ClangDiagnosticConfigsModel::indexOfConfig(const Core::Id &id) const { return Utils::indexOf(m_diagnosticConfigs, [&](const ClangDiagnosticConfig &config) { diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.h b/src/plugins/cpptools/clangdiagnosticconfigsmodel.h index 14ef823f3d..c6f4022526 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.h +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.h @@ -29,6 +29,8 @@ #include "clangdiagnosticconfig.h" +#include <QVector> + namespace CppTools { class CPPTOOLS_EXPORT ClangDiagnosticConfigsModel @@ -47,11 +49,11 @@ public: ClangDiagnosticConfigs configs() const; bool hasConfigWithId(const Core::Id &id) const; const ClangDiagnosticConfig &configWithId(const Core::Id &id) const; + int indexOfConfig(const Core::Id &id) const; static QString displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config); - -private: - int indexOfConfig(const Core::Id &id) const; + static QVector<Core::Id> changedOrRemovedConfigs(const ClangDiagnosticConfigs &oldConfigs, + const ClangDiagnosticConfigs &newConfigs); private: ClangDiagnosticConfigs m_diagnosticConfigs; diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index 15ec9c9bfe..71205cc427 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -73,9 +73,12 @@ static QString tidyChecksKey() static QString clazyChecksKey() { return QLatin1String(Constants::CPPTOOLS_CLAZY_CHECKS); } -void CppCodeModelSettings::fromSettings(QSettings *s) +static ClangDiagnosticConfigs customDiagnosticConfigsFromSettings(QSettings *s) { - s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); + QTC_ASSERT(s->group() == QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP), + return ClangDiagnosticConfigs()); + + ClangDiagnosticConfigs configs; const int size = s->beginReadArray(clangDiagnosticConfigsArrayKey()); for (int i = 0; i < size; ++i) { @@ -85,14 +88,27 @@ void CppCodeModelSettings::fromSettings(QSettings *s) config.setId(Core::Id::fromSetting(s->value(clangDiagnosticConfigsArrayIdKey()))); config.setDisplayName(s->value(clangDiagnosticConfigsArrayDisplayNameKey()).toString()); config.setCommandLineWarnings(s->value(clangDiagnosticConfigsArrayWarningsKey()).toStringList()); - m_clangCustomDiagnosticConfigs.append(config); + configs.append(config); } s->endArray(); - const Core::Id diagnosticConfigId = Core::Id::fromSetting( - s->value(clangDiagnosticConfigKey(), - initialClangDiagnosticConfigId().toSetting())); - setClangDiagnosticConfigId(diagnosticConfigId); + return configs; +} + +static Core::Id clangDiagnosticConfigIdFromSettings(QSettings *s) +{ + QTC_ASSERT(s->group() == QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP), return Core::Id()); + + return Core::Id::fromSetting( + s->value(clangDiagnosticConfigKey(), initialClangDiagnosticConfigId().toSetting())); +} + +void CppCodeModelSettings::fromSettings(QSettings *s) +{ + s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); + + setClangCustomDiagnosticConfigs(customDiagnosticConfigsFromSettings(s)); + setClangDiagnosticConfigId(clangDiagnosticConfigIdFromSettings(s)); const QVariant pchUsageVariant = s->value(pchUsageKey(), initialPchUsage()); setPCHUsage(static_cast<PCHUsage>(pchUsageVariant.toInt())); @@ -120,6 +136,8 @@ void CppCodeModelSettings::fromSettings(QSettings *s) void CppCodeModelSettings::toSettings(QSettings *s) { s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); + const ClangDiagnosticConfigs previousConfigs = customDiagnosticConfigsFromSettings(s); + const Core::Id previousConfigId = clangDiagnosticConfigIdFromSettings(s); s->beginWriteArray(clangDiagnosticConfigsArrayKey()); for (int i = 0, size = m_clangCustomDiagnosticConfigs.size(); i < size; ++i) { @@ -143,6 +161,15 @@ void CppCodeModelSettings::toSettings(QSettings *s) s->endGroup(); + QVector<Core::Id> invalidated + = ClangDiagnosticConfigsModel::changedOrRemovedConfigs(previousConfigs, + m_clangCustomDiagnosticConfigs); + + if (previousConfigId != clangDiagnosticConfigId() && !invalidated.contains(previousConfigId)) + invalidated.append(previousConfigId); + + if (!invalidated.isEmpty()) + emit clangDiagnosticConfigsInvalidated(invalidated); emit changed(); } diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index 22f5b25c6b..44661b2a4a 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -79,6 +79,7 @@ public: void setClazyChecks(QString checks); signals: + void clangDiagnosticConfigsInvalidated(const QVector<Core::Id> &configId); void changed(); private: |