summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-19 13:18:43 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-29 08:13:44 +0000
commit9b4688f1a4e88344b9a86abc58373b9e4c3ea9f8 (patch)
tree07c320bebebc8f030d868944d78313a3dde2e5dc
parent5b6b26893fe6bd244fa18a77852413523392c7b2 (diff)
downloadqt-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.cpp5
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfig.h1
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp17
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigsmodel.h8
-rw-r--r--src/plugins/cpptools/cppcodemodelsettings.cpp41
-rw-r--r--src/plugins/cpptools/cppcodemodelsettings.h1
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: