CppEditor: Simplify CppCodeModelSettings

We don't need the QObject wrapper.

Change-Id: Ief0e1314db40cb403c56fe0e660c5dffa326f83c
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2024-04-12 12:30:30 +02:00
parent d51128fb8a
commit ac4bf6901b
10 changed files with 103 additions and 125 deletions

View File

@@ -24,7 +24,7 @@ public:
CppEditor::ProjectPart::ConstPtr projectPart) CppEditor::ProjectPart::ConstPtr projectPart)
: file(std::move(file)) : file(std::move(file))
, kind(kind) , kind(kind)
, settings(settings.data()) , settings(settings)
, projectPart(projectPart) , projectPart(projectPart)
{} {}
@@ -34,7 +34,7 @@ public:
Utils::FilePath file; Utils::FilePath file;
CppEditor::ProjectFile::Kind kind; CppEditor::ProjectFile::Kind kind;
CppEditor::CppCodeModelSettings::Data settings; CppEditor::CppCodeModelSettings settings;
CppEditor::ProjectPart::ConstPtr projectPart; CppEditor::ProjectPart::ConstPtr projectPart;
}; };
using FileInfos = std::vector<FileInfo>; using FileInfos = std::vector<FileInfo>;

View File

@@ -37,10 +37,10 @@ BaseEditorDocumentProcessor::~BaseEditorDocumentProcessor() = default;
void BaseEditorDocumentProcessor::run(bool projectsUpdated) void BaseEditorDocumentProcessor::run(bool projectsUpdated)
{ {
if (projectsUpdated) if (projectsUpdated)
m_settings.setData(CppCodeModelSettings::settingsForFile(m_filePath).data()); m_settings = CppCodeModelSettings::settingsForFile(m_filePath);
const Utils::Language languagePreference const Utils::Language languagePreference
= m_settings.interpretAmbigiousHeadersAsC() ? Utils::Language::C : Utils::Language::Cxx; = m_settings.interpretAmbigiousHeadersAsC ? Utils::Language::C : Utils::Language::Cxx;
runImpl({CppModelManager::workingCopy(), runImpl({CppModelManager::workingCopy(),
ProjectExplorer::ProjectManager::startupProject(), ProjectExplorer::ProjectManager::startupProject(),

View File

@@ -151,7 +151,7 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(TextEditor::TextD
using namespace Internal; using namespace Internal;
BaseEditorDocumentParser::Configuration config = m_parser->configuration(); BaseEditorDocumentParser::Configuration config = m_parser->configuration();
config.usePrecompiledHeaders = settings().pchUsage() != CppCodeModelSettings::PchUse_None; config.usePrecompiledHeaders = settings().pchUsage != CppCodeModelSettings::PchUse_None;
m_parser->setConfiguration(config); m_parser->setConfiguration(config);
m_semanticHighlighter->setHighlightingRunner( m_semanticHighlighter->setHighlightingRunner(

View File

@@ -6,6 +6,7 @@
#include "compileroptionsbuilder.h" #include "compileroptionsbuilder.h"
#include "cppeditorconstants.h" #include "cppeditorconstants.h"
#include "cppeditortr.h" #include "cppeditortr.h"
#include "cppmodelmanager.h"
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -49,19 +50,19 @@ static Key useBuiltinPreprocessorKey() { return Constants::CPPEDITOR_USE_BUILTIN
static Key indexerFileSizeLimitKey() { return Constants::CPPEDITOR_INDEXER_FILE_SIZE_LIMIT; } static Key indexerFileSizeLimitKey() { return Constants::CPPEDITOR_INDEXER_FILE_SIZE_LIMIT; }
static Key useGlobalSettingsKey() { return "useGlobalSettings"; } static Key useGlobalSettingsKey() { return "useGlobalSettings"; }
bool operator==(const CppEditor::CppCodeModelSettings::Data &s1, bool operator==(const CppEditor::CppCodeModelSettings &s1,
const CppEditor::CppCodeModelSettings::Data &s2) const CppEditor::CppCodeModelSettings &s2)
{ {
return s1.pchUsage == s2.pchUsage return s1.pchUsage == s2.pchUsage
&& s1.interpretAmbigiousHeadersAsC == s2.interpretAmbigiousHeadersAsC && s1.interpretAmbigiousHeadersAsC == s2.interpretAmbigiousHeadersAsC
&& s1.skipIndexingBigFiles == s2.skipIndexingBigFiles && s1.skipIndexingBigFiles == s2.skipIndexingBigFiles
&& s1.useBuiltinPreprocessor == s2.useBuiltinPreprocessor && s1.useBuiltinPreprocessor == s2.useBuiltinPreprocessor
&& s1.indexerFileSizeLimitInMb == s2.indexerFileSizeLimitInMb && s1.indexerFileSizeLimitInMb == s2.indexerFileSizeLimitInMb
&& s1.categorizeFindReferences == s2.categorizeFindReferences && s1.m_categorizeFindReferences == s2.m_categorizeFindReferences
&& s1.ignoreFiles == s2.ignoreFiles && s1.ignorePattern == s2.ignorePattern; && s1.ignoreFiles == s2.ignoreFiles && s1.ignorePattern == s2.ignorePattern;
} }
Store CppCodeModelSettings::Data::toMap() const Store CppCodeModelSettings::toMap() const
{ {
Store store; Store store;
store.insert(pchUsageKey(), pchUsage); store.insert(pchUsageKey(), pchUsage);
@@ -74,15 +75,15 @@ Store CppCodeModelSettings::Data::toMap() const
return store; return store;
} }
void CppCodeModelSettings::Data::fromMap(const Utils::Store &store) void CppCodeModelSettings::fromMap(const Utils::Store &store)
{ {
const CppCodeModelSettings::Data def; const CppCodeModelSettings def;
pchUsage = static_cast<PCHUsage>(store.value(pchUsageKey(), def.pchUsage).toInt()); pchUsage = static_cast<PCHUsage>(store.value(pchUsageKey(), def.pchUsage).toInt());
interpretAmbigiousHeadersAsC = store interpretAmbigiousHeadersAsC
.value(interpretAmbiguousHeadersAsCHeadersKey(), = store.value(interpretAmbiguousHeadersAsCHeadersKey(), def.interpretAmbigiousHeadersAsC)
def.interpretAmbigiousHeadersAsC) .toBool();
.toBool(); skipIndexingBigFiles
skipIndexingBigFiles = store.value(skipIndexingBigFilesKey(), def.skipIndexingBigFiles).toBool(); = store.value(skipIndexingBigFilesKey(), def.skipIndexingBigFiles).toBool();
ignoreFiles = store.value(ignoreFilesKey(), def.ignoreFiles).toBool(); ignoreFiles = store.value(ignoreFilesKey(), def.ignoreFiles).toBool();
ignorePattern = store.value(ignorePatternKey(), def.ignorePattern).toString(); ignorePattern = store.value(ignorePatternKey(), def.ignorePattern).toString();
useBuiltinPreprocessor useBuiltinPreprocessor
@@ -93,12 +94,13 @@ void CppCodeModelSettings::Data::fromMap(const Utils::Store &store)
void CppCodeModelSettings::fromSettings(QtcSettings *s) void CppCodeModelSettings::fromSettings(QtcSettings *s)
{ {
m_data.fromMap(storeFromSettings(Constants::CPPEDITOR_SETTINGSGROUP, s)); fromMap(storeFromSettings(Constants::CPPEDITOR_SETTINGSGROUP, s));
} }
void CppCodeModelSettings::toSettings(QtcSettings *s) void CppCodeModelSettings::toSettings(QtcSettings *s)
{ {
storeToSettingsWithDefault(Constants::CPPEDITOR_SETTINGSGROUP, s, m_data.toMap(), Data().toMap()); storeToSettingsWithDefault(
Constants::CPPEDITOR_SETTINGSGROUP, s, toMap(), CppCodeModelSettings().toMap());
} }
CppCodeModelSettings &CppCodeModelSettings::globalInstance() CppCodeModelSettings &CppCodeModelSettings::globalInstance()
@@ -109,7 +111,7 @@ CppCodeModelSettings &CppCodeModelSettings::globalInstance()
CppCodeModelSettings CppCodeModelSettings::settingsForProject(const ProjectExplorer::Project *project) CppCodeModelSettings CppCodeModelSettings::settingsForProject(const ProjectExplorer::Project *project)
{ {
return {CppCodeModelProjectSettings(const_cast<ProjectExplorer::Project *>(project)).data()}; return {CppCodeModelProjectSettings(const_cast<ProjectExplorer::Project *>(project)).settings()};
} }
CppCodeModelSettings CppCodeModelSettings::settingsForProject(const Utils::FilePath &projectFile) CppCodeModelSettings CppCodeModelSettings::settingsForProject(const Utils::FilePath &projectFile)
@@ -122,25 +124,25 @@ CppCodeModelSettings CppCodeModelSettings::settingsForFile(const Utils::FilePath
return settingsForProject(ProjectManager::projectForFile(file)); return settingsForProject(ProjectManager::projectForFile(file));
} }
void CppCodeModelSettings::setGlobalData(const Data &data) void CppCodeModelSettings::setGlobal(const CppCodeModelSettings &settings)
{ {
if (globalInstance().m_data == data) if (globalInstance() == settings)
return; return;
globalInstance().m_data = data; globalInstance() = settings;
globalInstance().toSettings(Core::ICore::settings()); globalInstance().toSettings(Core::ICore::settings());
emit globalInstance().changed(nullptr); CppModelManager::handleSettingsChange(nullptr);
} }
CppCodeModelSettings::PCHUsage CppCodeModelSettings::pchUsage(const Project *project) CppCodeModelSettings::PCHUsage CppCodeModelSettings::pchUsageForProject(const Project *project)
{ {
return CppCodeModelSettings::settingsForProject(project).pchUsage(); return CppCodeModelSettings::settingsForProject(project).pchUsage;
} }
UsePrecompiledHeaders CppCodeModelSettings::usePrecompiledHeaders() const UsePrecompiledHeaders CppCodeModelSettings::usePrecompiledHeaders() const
{ {
return pchUsage() == CppCodeModelSettings::PchUse_None ? UsePrecompiledHeaders::No return pchUsage == CppCodeModelSettings::PchUse_None ? UsePrecompiledHeaders::No
: UsePrecompiledHeaders::Yes; : UsePrecompiledHeaders::Yes;
} }
UsePrecompiledHeaders CppCodeModelSettings::usePrecompiledHeaders(const Project *project) UsePrecompiledHeaders CppCodeModelSettings::usePrecompiledHeaders(const Project *project)
@@ -150,17 +152,17 @@ UsePrecompiledHeaders CppCodeModelSettings::usePrecompiledHeaders(const Project
int CppCodeModelSettings::effectiveIndexerFileSizeLimitInMb() const int CppCodeModelSettings::effectiveIndexerFileSizeLimitInMb() const
{ {
return skipIndexingBigFiles() ? indexerFileSizeLimitInMb() : -1; return skipIndexingBigFiles ? indexerFileSizeLimitInMb : -1;
} }
bool CppCodeModelSettings::categorizeFindReferences() bool CppCodeModelSettings::categorizeFindReferences()
{ {
return globalInstance().m_data.categorizeFindReferences; return globalInstance().m_categorizeFindReferences;
} }
void CppCodeModelSettings::setCategorizeFindReferences(bool categorize) void CppCodeModelSettings::setCategorizeFindReferences(bool categorize)
{ {
globalInstance().m_data.categorizeFindReferences = categorize; globalInstance().m_categorizeFindReferences = categorize;
} }
CppCodeModelProjectSettings::CppCodeModelProjectSettings(ProjectExplorer::Project *project) CppCodeModelProjectSettings::CppCodeModelProjectSettings(ProjectExplorer::Project *project)
@@ -169,23 +171,23 @@ CppCodeModelProjectSettings::CppCodeModelProjectSettings(ProjectExplorer::Projec
loadSettings(); loadSettings();
} }
CppCodeModelSettings::Data CppCodeModelProjectSettings::data() const CppCodeModelSettings CppCodeModelProjectSettings::settings() const
{ {
return m_useGlobalSettings ? CppCodeModelSettings::globalInstance().data() : m_customSettings; return m_useGlobalSettings ? CppCodeModelSettings::globalInstance() : m_customSettings;
} }
void CppCodeModelProjectSettings::setData(const CppCodeModelSettings::Data &data) void CppCodeModelProjectSettings::setSettings(const CppCodeModelSettings &settings)
{ {
m_customSettings = data; m_customSettings = settings;
saveSettings(); saveSettings();
emit CppCodeModelSettings::globalInstance().changed(m_project); CppModelManager::handleSettingsChange(m_project);
} }
void CppCodeModelProjectSettings::setUseGlobalSettings(bool useGlobal) void CppCodeModelProjectSettings::setUseGlobalSettings(bool useGlobal)
{ {
m_useGlobalSettings = useGlobal; m_useGlobalSettings = useGlobal;
saveSettings(); saveSettings();
emit CppCodeModelSettings::globalInstance().changed(m_project); CppModelManager::handleSettingsChange(m_project);
} }
void CppCodeModelProjectSettings::loadSettings() void CppCodeModelProjectSettings::loadSettings()
@@ -212,15 +214,14 @@ class CppCodeModelSettingsWidget final : public Core::IOptionsPageWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
CppCodeModelSettingsWidget(const CppCodeModelSettings::Data &data); CppCodeModelSettingsWidget(const CppCodeModelSettings &settings);
CppCodeModelSettings settings() const;
CppCodeModelSettings::Data data() const;
signals: signals:
void settingsDataChanged(); void settingsDataChanged();
private: private:
void apply() final { CppCodeModelSettings::globalInstance().setGlobalData(data()); } void apply() final { CppCodeModelSettings::globalInstance().setGlobal(settings()); }
QCheckBox *m_interpretAmbiguousHeadersAsCHeaders; QCheckBox *m_interpretAmbiguousHeadersAsCHeaders;
QCheckBox *m_ignorePchCheckBox; QCheckBox *m_ignorePchCheckBox;
@@ -231,18 +232,18 @@ private:
QPlainTextEdit *m_ignorePatternTextEdit; QPlainTextEdit *m_ignorePatternTextEdit;
}; };
CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSettings::Data &data) CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSettings &settings)
{ {
m_interpretAmbiguousHeadersAsCHeaders m_interpretAmbiguousHeadersAsCHeaders
= new QCheckBox(Tr::tr("Interpret ambiguous headers as C headers")); = new QCheckBox(Tr::tr("Interpret ambiguous headers as C headers"));
m_skipIndexingBigFilesCheckBox = new QCheckBox(Tr::tr("Do not index files greater than")); m_skipIndexingBigFilesCheckBox = new QCheckBox(Tr::tr("Do not index files greater than"));
m_skipIndexingBigFilesCheckBox->setChecked(data.skipIndexingBigFiles); m_skipIndexingBigFilesCheckBox->setChecked(settings.skipIndexingBigFiles);
m_bigFilesLimitSpinBox = new QSpinBox; m_bigFilesLimitSpinBox = new QSpinBox;
m_bigFilesLimitSpinBox->setSuffix(Tr::tr("MB")); m_bigFilesLimitSpinBox->setSuffix(Tr::tr("MB"));
m_bigFilesLimitSpinBox->setRange(1, 500); m_bigFilesLimitSpinBox->setRange(1, 500);
m_bigFilesLimitSpinBox->setValue(data.indexerFileSizeLimitInMb); m_bigFilesLimitSpinBox->setValue(settings.indexerFileSizeLimitInMb);
m_ignoreFilesCheckBox = new QCheckBox(Tr::tr("Ignore files")); m_ignoreFilesCheckBox = new QCheckBox(Tr::tr("Ignore files"));
m_ignoreFilesCheckBox->setToolTip( m_ignoreFilesCheckBox->setToolTip(
@@ -250,8 +251,8 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSetting
+ Tr::tr("Ignore files that match these wildcard patterns, one wildcard per line.") + Tr::tr("Ignore files that match these wildcard patterns, one wildcard per line.")
+ "</p></body></html>"); + "</p></body></html>");
m_ignoreFilesCheckBox->setChecked(data.ignoreFiles); m_ignoreFilesCheckBox->setChecked(settings.ignoreFiles);
m_ignorePatternTextEdit = new QPlainTextEdit(data.ignorePattern); m_ignorePatternTextEdit = new QPlainTextEdit(settings.ignorePattern);
m_ignorePatternTextEdit->setToolTip(m_ignoreFilesCheckBox->toolTip()); m_ignorePatternTextEdit->setToolTip(m_ignoreFilesCheckBox->toolTip());
m_ignorePatternTextEdit->setEnabled(m_ignoreFilesCheckBox->isChecked()); m_ignorePatternTextEdit->setEnabled(m_ignoreFilesCheckBox->isChecked());
@@ -271,9 +272,9 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSetting
(Tr::tr("Uncheck this to invoke the actual compiler " (Tr::tr("Uncheck this to invoke the actual compiler "
"to show a pre-processed source file in the editor.")); "to show a pre-processed source file in the editor."));
m_interpretAmbiguousHeadersAsCHeaders->setChecked(data.interpretAmbigiousHeadersAsC); m_interpretAmbiguousHeadersAsCHeaders->setChecked(settings.interpretAmbigiousHeadersAsC);
m_ignorePchCheckBox->setChecked(data.pchUsage == CppCodeModelSettings::PchUse_None); m_ignorePchCheckBox->setChecked(settings.pchUsage == CppCodeModelSettings::PchUse_None);
m_useBuiltinPreprocessorCheckBox->setChecked(data.useBuiltinPreprocessor); m_useBuiltinPreprocessorCheckBox->setChecked(settings.useBuiltinPreprocessor);
using namespace Layouting; using namespace Layouting;
@@ -309,18 +310,18 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSetting
timer, qOverload<>(&QTimer::start)); timer, qOverload<>(&QTimer::start));
} }
CppCodeModelSettings::Data CppCodeModelSettingsWidget::data() const CppCodeModelSettings CppCodeModelSettingsWidget::settings() const
{ {
CppCodeModelSettings::Data data; CppCodeModelSettings settings;
data.interpretAmbigiousHeadersAsC = m_interpretAmbiguousHeadersAsCHeaders->isChecked(); settings.interpretAmbigiousHeadersAsC = m_interpretAmbiguousHeadersAsCHeaders->isChecked();
data.skipIndexingBigFiles = m_skipIndexingBigFilesCheckBox->isChecked(); settings.skipIndexingBigFiles = m_skipIndexingBigFilesCheckBox->isChecked();
data.useBuiltinPreprocessor = m_useBuiltinPreprocessorCheckBox->isChecked(); settings.useBuiltinPreprocessor = m_useBuiltinPreprocessorCheckBox->isChecked();
data.ignoreFiles = m_ignoreFilesCheckBox->isChecked(); settings.ignoreFiles = m_ignoreFilesCheckBox->isChecked();
data.ignorePattern = m_ignorePatternTextEdit->toPlainText(); settings.ignorePattern = m_ignorePatternTextEdit->toPlainText();
data.indexerFileSizeLimitInMb = m_bigFilesLimitSpinBox->value(); settings.indexerFileSizeLimitInMb = m_bigFilesLimitSpinBox->value();
data.pchUsage = m_ignorePchCheckBox->isChecked() ? CppCodeModelSettings::PchUse_None settings.pchUsage = m_ignorePchCheckBox->isChecked() ? CppCodeModelSettings::PchUse_None
: CppCodeModelSettings::PchUse_BuildSystem; : CppCodeModelSettings::PchUse_BuildSystem;
return data; return settings;
} }
class CppCodeModelSettingsPage final : public Core::IOptionsPage class CppCodeModelSettingsPage final : public Core::IOptionsPage
@@ -334,7 +335,7 @@ public:
setDisplayCategory(Tr::tr("C++")); setDisplayCategory(Tr::tr("C++"));
setCategoryIconPath(":/projectexplorer/images/settingscategory_cpp.png"); setCategoryIconPath(":/projectexplorer/images/settingscategory_cpp.png");
setWidgetCreator( setWidgetCreator(
[] { return new CppCodeModelSettingsWidget(CppCodeModelSettings::globalInstance().data()); }); [] { return new CppCodeModelSettingsWidget(CppCodeModelSettings::globalInstance()); });
} }
}; };
@@ -347,7 +348,7 @@ class CppCodeModelProjectSettingsWidget : public ProjectSettingsWidget
{ {
public: public:
CppCodeModelProjectSettingsWidget(const CppCodeModelProjectSettings &settings) CppCodeModelProjectSettingsWidget(const CppCodeModelProjectSettings &settings)
: m_settings(settings), m_widget(settings.data()) : m_settings(settings), m_widget(settings.settings())
{ {
setGlobalSettingsId(Constants::CPP_CODE_MODEL_SETTINGS_ID); setGlobalSettingsId(Constants::CPP_CODE_MODEL_SETTINGS_ID);
const auto layout = new QVBoxLayout(this); const auto layout = new QVBoxLayout(this);
@@ -361,11 +362,11 @@ public:
m_widget.setEnabled(!checked); m_widget.setEnabled(!checked);
m_settings.setUseGlobalSettings(checked); m_settings.setUseGlobalSettings(checked);
if (!checked) if (!checked)
m_settings.setData(m_widget.data()); m_settings.setSettings(m_widget.settings());
}); });
connect(&m_widget, &CppCodeModelSettingsWidget::settingsDataChanged, connect(&m_widget, &CppCodeModelSettingsWidget::settingsDataChanged,
this, [this] { m_settings.setData(m_widget.data()); }); this, [this] { m_settings.setSettings(m_widget.settings()); });
} }
private: private:

View File

@@ -10,7 +10,6 @@
#include <utils/store.h> #include <utils/store.h>
#include <utils/qtcsettings.h> #include <utils/qtcsettings.h>
#include <QObject>
#include <QStringList> #include <QStringList>
namespace ProjectExplorer { class Project; } namespace ProjectExplorer { class Project; }
@@ -18,75 +17,56 @@ namespace ProjectExplorer { class Project; }
namespace CppEditor { namespace CppEditor {
enum class UsePrecompiledHeaders; enum class UsePrecompiledHeaders;
class CPPEDITOR_EXPORT CppCodeModelSettings : public QObject class CPPEDITOR_EXPORT CppCodeModelSettings
{ {
Q_OBJECT
public: public:
enum PCHUsage { enum PCHUsage {
PchUse_None = 1, PchUse_None = 1,
PchUse_BuildSystem = 2 PchUse_BuildSystem = 2
}; };
class Data CppCodeModelSettings() = default;
CppCodeModelSettings(const Utils::Store &store) { fromMap(store); }
friend bool operator==(const CppCodeModelSettings &s1, const CppCodeModelSettings &s2);
friend bool operator!=(const CppCodeModelSettings &s1, const CppCodeModelSettings &s2)
{ {
public: return !(s1 == s2);
Data() = default; }
Data(const Utils::Store &store) { fromMap(store); }
Utils::Store toMap() const;
void fromMap(const Utils::Store &store);
friend bool operator==(const Data &s1, const Data &s2); Utils::Store toMap() const;
friend bool operator!=(const Data &s1, const Data &s2) { return !(s1 == s2); } void fromMap(const Utils::Store &store);
PCHUsage pchUsage = PchUse_BuildSystem;
bool interpretAmbigiousHeadersAsC = false;
bool skipIndexingBigFiles = true;
bool useBuiltinPreprocessor = true;
int indexerFileSizeLimitInMb = 5;
bool categorizeFindReferences = false; // Ephemeral!
bool ignoreFiles = false;
QString ignorePattern;
};
CppCodeModelSettings(const Data &data) : m_data(data) {}
static CppCodeModelSettings &globalInstance(); // TODO: Make inaccessible. static CppCodeModelSettings &globalInstance(); // TODO: Make inaccessible.
static CppCodeModelSettings settingsForProject(const ProjectExplorer::Project *project); static CppCodeModelSettings settingsForProject(const ProjectExplorer::Project *project);
static CppCodeModelSettings settingsForProject(const Utils::FilePath &projectFile); static CppCodeModelSettings settingsForProject(const Utils::FilePath &projectFile);
static CppCodeModelSettings settingsForFile(const Utils::FilePath &file); static CppCodeModelSettings settingsForFile(const Utils::FilePath &file);
static void setGlobalData(const Data &data); // TODO: Make inaccessible. static void setGlobal(const CppCodeModelSettings &settings); // TODO: Make inaccessible.
void setData(const Data &data) { m_data = data; }
Data data() const { return m_data; }
PCHUsage pchUsage() const { return m_data.pchUsage; } static PCHUsage pchUsageForProject(const ProjectExplorer::Project *project);
static PCHUsage pchUsage(const ProjectExplorer::Project *project);
UsePrecompiledHeaders usePrecompiledHeaders() const; UsePrecompiledHeaders usePrecompiledHeaders() const;
static UsePrecompiledHeaders usePrecompiledHeaders(const ProjectExplorer::Project *project); static UsePrecompiledHeaders usePrecompiledHeaders(const ProjectExplorer::Project *project);
bool interpretAmbigiousHeadersAsC() const { return m_data.interpretAmbigiousHeadersAsC; }
bool skipIndexingBigFiles() const { return m_data.skipIndexingBigFiles; }
bool useBuiltinPreprocessor() const { return m_data.useBuiltinPreprocessor; }
int indexerFileSizeLimitInMb() const { return m_data.indexerFileSizeLimitInMb; }
int effectiveIndexerFileSizeLimitInMb() const; int effectiveIndexerFileSizeLimitInMb() const;
bool ignoreFiles() const { return m_data.ignoreFiles; }
QString ignorePattern() const { return m_data.ignorePattern; }
static bool categorizeFindReferences(); static bool categorizeFindReferences();
static void setCategorizeFindReferences(bool categorize); static void setCategorizeFindReferences(bool categorize);
signals: QString ignorePattern;
void changed(ProjectExplorer::Project *project); PCHUsage pchUsage = PchUse_BuildSystem;
int indexerFileSizeLimitInMb = 5;
bool interpretAmbigiousHeadersAsC = false;
bool skipIndexingBigFiles = true;
bool useBuiltinPreprocessor = true;
bool ignoreFiles = false;
bool m_categorizeFindReferences = false; // Ephemeral!
private: private:
CppCodeModelSettings() = default;
CppCodeModelSettings(Utils::QtcSettings *s) { fromSettings(s); } CppCodeModelSettings(Utils::QtcSettings *s) { fromSettings(s); }
void toSettings(Utils::QtcSettings *s); void toSettings(Utils::QtcSettings *s);
void fromSettings(Utils::QtcSettings *s); void fromSettings(Utils::QtcSettings *s);
Data m_data;
}; };
class CppCodeModelProjectSettings class CppCodeModelProjectSettings
@@ -94,8 +74,8 @@ class CppCodeModelProjectSettings
public: public:
CppCodeModelProjectSettings(ProjectExplorer::Project *project); CppCodeModelProjectSettings(ProjectExplorer::Project *project);
CppCodeModelSettings::Data data() const; CppCodeModelSettings settings() const;
void setData(const CppCodeModelSettings::Data &data); void setSettings(const CppCodeModelSettings &settings);
bool useGlobalSettings() const { return m_useGlobalSettings; } bool useGlobalSettings() const { return m_useGlobalSettings; }
void setUseGlobalSettings(bool useGlobal); void setUseGlobalSettings(bool useGlobal);
@@ -104,7 +84,7 @@ private:
void saveSettings(); void saveSettings();
ProjectExplorer::Project * const m_project; ProjectExplorer::Project * const m_project;
CppCodeModelSettings::Data m_customSettings; CppCodeModelSettings m_customSettings;
bool m_useGlobalSettings = true; bool m_useGlobalSettings = true;
}; };

View File

@@ -204,7 +204,7 @@ void CppEditorPlugin::initialize()
setupCppQuickFixSettings(); setupCppQuickFixSettings();
setupCppCodeModelSettingsPage(); setupCppCodeModelSettingsPage();
provideCppSettingsRetriever([](const Project *p) { provideCppSettingsRetriever([](const Project *p) {
return CppCodeModelSettings::settingsForProject(p).data().toMap(); return CppCodeModelSettings::settingsForProject(p).toMap();
}); });
setupCppOutline(); setupCppOutline();
setupCppCodeStyleSettings(); setupCppCodeStyleSettings();

View File

@@ -407,7 +407,7 @@ void CppModelManager::showPreprocessedFile(bool inNextSplit)
saveAndOpen(outFilePath, content.append(preprocessedDoc->utf8Source()), inNextSplit); saveAndOpen(outFilePath, content.append(preprocessedDoc->utf8Source()), inNextSplit);
}; };
if (CppCodeModelSettings::settingsForFile(filePath).useBuiltinPreprocessor()) { if (CppCodeModelSettings::settingsForFile(filePath).useBuiltinPreprocessor) {
useBuiltinPreprocessor(); useBuiltinPreprocessor();
return; return;
} }
@@ -1023,9 +1023,6 @@ CppModelManager::CppModelManager()
connect(ICore::instance(), &ICore::coreAboutToClose, connect(ICore::instance(), &ICore::coreAboutToClose,
this, &CppModelManager::onCoreAboutToClose); this, &CppModelManager::onCoreAboutToClose);
connect(&CppCodeModelSettings::globalInstance(), &CppCodeModelSettings::changed,
this, &CppModelManager::onSettingsChange);
d->m_fallbackProjectPartTimer.setSingleShot(true); d->m_fallbackProjectPartTimer.setSingleShot(true);
d->m_fallbackProjectPartTimer.setInterval(5000); d->m_fallbackProjectPartTimer.setInterval(5000);
connect(&d->m_fallbackProjectPartTimer, &QTimer::timeout, connect(&d->m_fallbackProjectPartTimer, &QTimer::timeout,
@@ -1360,8 +1357,8 @@ QFuture<void> CppModelManager::updateSourceFiles(const QSet<FilePath> &sourceFil
const CppCodeModelSettings settings = CppCodeModelSettings::settingsForProject(it.key()); const CppCodeModelSettings settings = CppCodeModelSettings::settingsForProject(it.key());
filteredFiles.unite(filteredFilesRemoved(it.value(), filteredFiles.unite(filteredFilesRemoved(it.value(),
settings.effectiveIndexerFileSizeLimitInMb(), settings.effectiveIndexerFileSizeLimitInMb(),
settings.ignoreFiles(), settings.ignoreFiles,
settings.ignorePattern())); settings.ignorePattern));
} }
return d->m_internalIndexingSupport->refreshSourceFiles(filteredFiles, mode); return d->m_internalIndexingSupport->refreshSourceFiles(filteredFiles, mode);
@@ -2013,7 +2010,7 @@ void CppModelManager::onCoreAboutToClose()
d->m_enableGC = false; d->m_enableGC = false;
} }
void CppModelManager::onSettingsChange(Project *project) void CppModelManager::handleSettingsChange(Project *project)
{ {
ProjectInfoList info; ProjectInfoList info;
if (project) if (project)
@@ -2023,7 +2020,7 @@ void CppModelManager::onSettingsChange(Project *project)
for (const ProjectInfo::ConstPtr &pi : std::as_const(info)) { for (const ProjectInfo::ConstPtr &pi : std::as_const(info)) {
const CppCodeModelSettings newSettings = CppCodeModelSettings::settingsForProject( const CppCodeModelSettings newSettings = CppCodeModelSettings::settingsForProject(
pi->projectFilePath()); pi->projectFilePath());
if (pi->settings().data() != newSettings.data()) if (pi->settings() != newSettings)
updateProjectInfo(ProjectInfo::cloneWithNewSettings(pi, newSettings)); updateProjectInfo(ProjectInfo::cloneWithNewSettings(pi, newSettings));
} }
} }

View File

@@ -110,6 +110,8 @@ public:
static QFuture<void> updateProjectInfo(const ProjectInfo::ConstPtr &newProjectInfo, static QFuture<void> updateProjectInfo(const ProjectInfo::ConstPtr &newProjectInfo,
const QSet<Utils::FilePath> &additionalFiles = {}); const QSet<Utils::FilePath> &additionalFiles = {});
static void handleSettingsChange(ProjectExplorer::Project *project);
/// \return The project part with the given project file /// \return The project part with the given project file
static ProjectPart::ConstPtr projectPartForId(const QString &projectPartId); static ProjectPart::ConstPtr projectPartForId(const QString &projectPartId);
/// \return All project parts that mention the given file name as one of the sources/headers. /// \return All project parts that mention the given file name as one of the sources/headers.
@@ -288,7 +290,6 @@ private:
static void onSourceFilesRefreshed(); static void onSourceFilesRefreshed();
static void onCurrentEditorChanged(Core::IEditor *editor); static void onCurrentEditorChanged(Core::IEditor *editor);
static void onCoreAboutToClose(); static void onCoreAboutToClose();
static void onSettingsChange(ProjectExplorer::Project *project);
static void setupFallbackProjectPart(); static void setupFallbackProjectPart();
static void delayedGC(); static void delayedGC();

View File

@@ -1283,10 +1283,9 @@ void ModelManagerTest::testSettingsChanges()
// Change global settings. Only the second project should get re-indexed, as the first one // Change global settings. Only the second project should get re-indexed, as the first one
// has its own settings, which are still the same. // has its own settings, which are still the same.
CppCodeModelSettings::Data globalSettings CppCodeModelSettings globalSettings = CppCodeModelSettings::settingsForProject(nullptr);
= CppCodeModelSettings::settingsForProject(nullptr).data();
globalSettings.indexerFileSizeLimitInMb = 1; globalSettings.indexerFileSizeLimitInMb = 1;
CppCodeModelSettings::setGlobalData(globalSettings); CppCodeModelSettings::setGlobal(globalSettings);
if (refreshCount == 0) if (refreshCount == 0)
QVERIFY(waitForRefresh()); QVERIFY(waitForRefresh());
QVERIFY(!waitForRefresh()); QVERIFY(!waitForRefresh());
@@ -1295,10 +1294,10 @@ void ModelManagerTest::testSettingsChanges()
// Change first project's settings. Only this project should get re-indexed. // Change first project's settings. Only this project should get re-indexed.
refreshCount = 0; refreshCount = 0;
refreshedFiles.clear(); refreshedFiles.clear();
CppCodeModelSettings::Data p1Data = p1Settings.data(); CppCodeModelSettings p1Data = p1Settings.settings();
p1Data.ignoreFiles = true; p1Data.ignoreFiles = true;
p1Data.ignorePattern = "baz3.h"; p1Data.ignorePattern = "baz3.h";
p1Settings.setData(p1Data); p1Settings.setSettings(p1Data);
if (refreshCount == 0) if (refreshCount == 0)
QVERIFY(waitForRefresh()); QVERIFY(waitForRefresh());
QVERIFY(!waitForRefresh()); QVERIFY(!waitForRefresh());

View File

@@ -33,7 +33,7 @@ bool ProjectInfo::operator ==(const ProjectInfo &other) const
&& m_projectParts == other.m_projectParts && m_projectParts == other.m_projectParts
&& m_headerPaths == other.m_headerPaths && m_headerPaths == other.m_headerPaths
&& m_sourceFiles == other.m_sourceFiles && m_sourceFiles == other.m_sourceFiles
&& m_settings.data() == other.m_settings.data() && m_settings == other.m_settings
&& m_defines == other.m_defines; && m_defines == other.m_defines;
} }
@@ -50,7 +50,7 @@ bool ProjectInfo::definesChanged(const ProjectInfo &other) const
bool ProjectInfo::configurationChanged(const ProjectInfo &other) const bool ProjectInfo::configurationChanged(const ProjectInfo &other) const
{ {
return definesChanged(other) || m_headerPaths != other.m_headerPaths return definesChanged(other) || m_headerPaths != other.m_headerPaths
|| m_settings.data() != other.settings().data(); || m_settings != other.settings();
} }
bool ProjectInfo::configurationOrFilesChanged(const ProjectInfo &other) const bool ProjectInfo::configurationOrFilesChanged(const ProjectInfo &other) const
@@ -98,7 +98,7 @@ ProjectInfo::ProjectInfo(const ProjectExplorer::ProjectUpdateInfo &updateInfo,
m_headerPaths(getHeaderPaths(projectParts)), m_headerPaths(getHeaderPaths(projectParts)),
m_sourceFiles(getSourceFiles(projectParts)), m_sourceFiles(getSourceFiles(projectParts)),
m_defines(getDefines(projectParts)), m_defines(getDefines(projectParts)),
m_settings(CppCodeModelSettings::Data(updateInfo.cppSettings)) m_settings(updateInfo.cppSettings)
{ {
} }
@@ -110,7 +110,7 @@ ProjectInfo::ProjectInfo(const ConstPtr &pi, const CppCodeModelSettings &setting
m_headerPaths(pi->m_headerPaths), m_headerPaths(pi->m_headerPaths),
m_sourceFiles(pi->sourceFiles()), m_sourceFiles(pi->sourceFiles()),
m_defines(pi->m_defines), m_defines(pi->m_defines),
m_settings(settings.data()) m_settings(settings)
{ {
} }