Clang: Let CppCodeModelSettings announce invalidated diagnostic configs

Change-Id: I1fe62d4cd4bc91bfd73e57ace6dc9a87d13b3537
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-01-19 13:18:43 +01:00
parent 5b6b26893f
commit 9b4688f1a4
6 changed files with 63 additions and 10 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -79,6 +79,7 @@ public:
void setClazyChecks(QString checks);
signals:
void clangDiagnosticConfigsInvalidated(const QVector<Core::Id> &configId);
void changed();
private: