CppEditor: Refactor CppCodeModelSettings

Preparation for per-project settings.

Change-Id: I78ecf0cde6150e40353c4aea6a98717d119f05c7
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Christian Kandeler
2024-02-21 15:49:10 +01:00
parent 48a8fa4c5d
commit 3f692e2f17
5 changed files with 137 additions and 223 deletions

View File

@@ -35,7 +35,7 @@ BaseEditorDocumentProcessor::~BaseEditorDocumentProcessor() = default;
void BaseEditorDocumentProcessor::run(bool projectsUpdated) void BaseEditorDocumentProcessor::run(bool projectsUpdated)
{ {
const Utils::Language languagePreference = codeModelSettings()->interpretAmbigiousHeadersAsCHeaders() const Utils::Language languagePreference = codeModelSettings()->interpretAmbigiousHeadersAsC()
? Utils::Language::C ? Utils::Language::C
: Utils::Language::Cxx; : Utils::Language::Cxx;

View File

@@ -90,11 +90,7 @@ void ClangDiagnosticConfigsSelectionWidget::onButtonClicked()
connect(buttonsBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); connect(buttonsBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
connect(buttonsBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); connect(buttonsBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
const bool previousEnableLowerClazyLevels = codeModelSettings()->enableLowerClazyLevels();
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
if (previousEnableLowerClazyLevels != codeModelSettings()->enableLowerClazyLevels())
codeModelSettings()->toSettings(Core::ICore::settings());
m_diagnosticConfigsModel = ClangDiagnosticConfigsModel(widget->configs()); m_diagnosticConfigsModel = ClangDiagnosticConfigsModel(widget->configs());
m_currentConfigId = widget->currentConfig().id(); m_currentConfigId = widget->currentConfig().id();
m_button->setText(widget->currentConfig().displayName()); m_button->setText(widget->currentConfig().displayName());

View File

@@ -71,135 +71,98 @@ static FilePath fallbackClangdFilePath()
return Environment::systemEnvironment().searchInPath("clangd"); return Environment::systemEnvironment().searchInPath("clangd");
} }
bool operator==(const CppEditor::CppCodeModelSettings::Data &s1,
const CppEditor::CppCodeModelSettings::Data &s2)
{
return s1.pchUsage == s2.pchUsage
&& s1.interpretAmbigiousHeadersAsC == s2.interpretAmbigiousHeadersAsC
&& s1.skipIndexingBigFiles == s2.skipIndexingBigFiles
&& s1.useBuiltinPreprocessor == s2.useBuiltinPreprocessor
&& s1.indexerFileSizeLimitInMb == s2.indexerFileSizeLimitInMb
&& s1.enableLowerClazyLevels == s2.enableLowerClazyLevels
&& s1.categorizeFindReferences == s2.categorizeFindReferences
&& s1.ignoreFiles == s2.ignoreFiles && s1.ignorePattern == s2.ignorePattern;
}
Store CppCodeModelSettings::Data::toMap() const
{
const CppCodeModelSettings::Data def;
Store store;
store.insertValueWithDefault(enableLowerClazyLevelsKey(),
enableLowerClazyLevels,
def.enableLowerClazyLevels);
store.insertValueWithDefault(pchUsageKey(), pchUsage, def.pchUsage);
store.insertValueWithDefault(interpretAmbiguousHeadersAsCHeadersKey(),
interpretAmbigiousHeadersAsC,
def.interpretAmbigiousHeadersAsC);
store.insertValueWithDefault(skipIndexingBigFilesKey(),
skipIndexingBigFiles,
def.skipIndexingBigFiles);
store.insertValueWithDefault(ignoreFilesKey(), ignoreFiles, def.ignoreFiles);
store.insertValueWithDefault(ignorePatternKey(), ignorePattern, def.ignorePattern);
store.insertValueWithDefault(useBuiltinPreprocessorKey(),
useBuiltinPreprocessor,
def.useBuiltinPreprocessor);
store.insertValueWithDefault(indexerFileSizeLimitKey(),
indexerFileSizeLimitInMb,
def.indexerFileSizeLimitInMb);
return store;
}
void CppCodeModelSettings::Data::fromMap(const Utils::Store &store)
{
const CppCodeModelSettings::Data def;
enableLowerClazyLevels
= store.value(enableLowerClazyLevelsKey(), def.enableLowerClazyLevels).toBool();
pchUsage = static_cast<PCHUsage>(store.value(pchUsageKey(), def.pchUsage).toInt());
interpretAmbigiousHeadersAsC = store
.value(interpretAmbiguousHeadersAsCHeadersKey(),
def.interpretAmbigiousHeadersAsC)
.toBool();
skipIndexingBigFiles = store.value(skipIndexingBigFilesKey(), def.skipIndexingBigFiles).toBool();
ignoreFiles = store.value(ignoreFilesKey(), def.ignoreFiles).toBool();
ignorePattern = store.value(ignorePatternKey(), def.ignorePattern).toString();
useBuiltinPreprocessor
= store.value(useBuiltinPreprocessorKey(), def.useBuiltinPreprocessor).toBool();
indexerFileSizeLimitInMb
= store.value(indexerFileSizeLimitKey(), def.indexerFileSizeLimitInMb).toInt();
}
void CppCodeModelSettings::fromSettings(QtcSettings *s) void CppCodeModelSettings::fromSettings(QtcSettings *s)
{ {
fromMap(storeFromSettings(Constants::CPPEDITOR_SETTINGSGROUP, s)); m_data.fromMap(storeFromSettings(Constants::CPPEDITOR_SETTINGSGROUP, s));
emit changed(); emit changed();
} }
void CppCodeModelSettings::toSettings(QtcSettings *s) void CppCodeModelSettings::toSettings(QtcSettings *s)
{ {
storeToSettings(Constants::CPPEDITOR_SETTINGSGROUP, s, toMap()); storeToSettings(Constants::CPPEDITOR_SETTINGSGROUP, s, m_data.toMap());
emit changed(); // TODO: Why? emit changed(); // TODO: Why?
} }
Store CppCodeModelSettings::toMap() const void CppCodeModelSettings::setData(const Data &data)
{ {
const CppCodeModelSettings def; if (m_data != data) {
Store store; m_data = data;
store.insertValueWithDefault(enableLowerClazyLevelsKey(), toSettings(Core::ICore::settings());
enableLowerClazyLevels(), emit changed();
def.enableLowerClazyLevels()); }
store.insertValueWithDefault(pchUsageKey(), pchUsage(), def.pchUsage());
store.insertValueWithDefault(interpretAmbiguousHeadersAsCHeadersKey(),
interpretAmbigiousHeadersAsCHeaders(),
def.interpretAmbigiousHeadersAsCHeaders());
store.insertValueWithDefault(skipIndexingBigFilesKey(),
skipIndexingBigFiles(),
def.skipIndexingBigFiles());
store.insertValueWithDefault(ignoreFilesKey(), ignoreFiles(), def.ignoreFiles());
store.insertValueWithDefault(ignorePatternKey(), ignorePattern(), def.ignorePattern());
store.insertValueWithDefault(useBuiltinPreprocessorKey(),
useBuiltinPreprocessor(),
def.useBuiltinPreprocessor());
store.insertValueWithDefault(indexerFileSizeLimitKey(),
indexerFileSizeLimitInMb(),
def.indexerFileSizeLimitInMb());
return store;
} }
void CppCodeModelSettings::fromMap(const Utils::Store &store) void CppCodeModelSettings::setEnableLowerClazyLevels(bool enable)
{ {
const CppCodeModelSettings def; Data d = data();
setEnableLowerClazyLevels( d.enableLowerClazyLevels = enable;
store.value(enableLowerClazyLevelsKey(), def.enableLowerClazyLevels()).toBool()); setData(d);
setPCHUsage(static_cast<PCHUsage>(store.value(pchUsageKey(), def.pchUsage()).toInt()));
setInterpretAmbigiousHeadersAsCHeaders(store
.value(interpretAmbiguousHeadersAsCHeadersKey(),
def.interpretAmbigiousHeadersAsCHeaders())
.toBool());
setSkipIndexingBigFiles(
store.value(skipIndexingBigFilesKey(), def.skipIndexingBigFiles()).toBool());
setIgnoreFiles(store.value(ignoreFilesKey(), def.ignoreFiles()).toBool());
setIgnorePattern(store.value(ignorePatternKey(), def.ignorePattern()).toString());
setUseBuiltinPreprocessor(
store.value(useBuiltinPreprocessorKey(), def.useBuiltinPreprocessor()).toBool());
setIndexerFileSizeLimitInMb(
store.value(indexerFileSizeLimitKey(), def.indexerFileSizeLimitInMb()).toInt());
} }
CppCodeModelSettings::PCHUsage CppCodeModelSettings::pchUsage() const void CppCodeModelSettings::setCategorizeFindReferences(bool categorize)
{ {
return m_pchUsage; Data d = data();
d.categorizeFindReferences = categorize;
setData(d);
} }
void CppCodeModelSettings::setPCHUsage(CppCodeModelSettings::PCHUsage pchUsage)
{
m_pchUsage = pchUsage;
}
bool CppCodeModelSettings::interpretAmbigiousHeadersAsCHeaders() const
{
return m_interpretAmbigiousHeadersAsCHeaders;
}
void CppCodeModelSettings::setInterpretAmbigiousHeadersAsCHeaders(bool yesno)
{
m_interpretAmbigiousHeadersAsCHeaders = yesno;
}
bool CppCodeModelSettings::skipIndexingBigFiles() const
{
return m_skipIndexingBigFiles;
}
void CppCodeModelSettings::setSkipIndexingBigFiles(bool yesno)
{
m_skipIndexingBigFiles = yesno;
}
int CppCodeModelSettings::indexerFileSizeLimitInMb() const
{
return m_indexerFileSizeLimitInMB;
}
void CppCodeModelSettings::setIndexerFileSizeLimitInMb(int sizeInMB)
{
m_indexerFileSizeLimitInMB = sizeInMB;
}
bool CppCodeModelSettings::ignoreFiles() const
{
return m_ignoreFiles;
}
void CppCodeModelSettings::setIgnoreFiles(bool ignoreFiles)
{
m_ignoreFiles = ignoreFiles;
}
QString CppCodeModelSettings::ignorePattern() const
{
return m_ignorePattern;
}
void CppCodeModelSettings::setIgnorePattern(const QString& ignorePattern)
{
m_ignorePattern = ignorePattern;
}
bool CppCodeModelSettings::enableLowerClazyLevels() const
{
return m_enableLowerClazyLevels;
}
void CppCodeModelSettings::setEnableLowerClazyLevels(bool yesno)
{
m_enableLowerClazyLevels = yesno;
}
QString ClangdSettings::priorityToString(const IndexingPriority &priority) QString ClangdSettings::priorityToString(const IndexingPriority &priority)
{ {
switch (priority) { switch (priority) {

View File

@@ -34,54 +34,56 @@ public:
PchUse_BuildSystem = 2 PchUse_BuildSystem = 2
}; };
class Data
{
public:
Utils::Store toMap() const;
void fromMap(const Utils::Store &store);
friend bool operator==(const Data &s1, const Data &s2);
friend bool operator!=(const Data &s1, const Data &s2) { return !(s1 == s2); }
PCHUsage pchUsage = PchUse_BuildSystem;
bool interpretAmbigiousHeadersAsC = false;
bool skipIndexingBigFiles = true;
bool useBuiltinPreprocessor = true;
int indexerFileSizeLimitInMb = 5;
bool enableLowerClazyLevels = true; // For UI behavior only
bool categorizeFindReferences = false; // Ephemeral!
bool ignoreFiles = false;
QString ignorePattern;
};
CppCodeModelSettings(Utils::QtcSettings *s) { fromSettings(s); } CppCodeModelSettings(Utils::QtcSettings *s) { fromSettings(s); }
void toSettings(Utils::QtcSettings *s); void setData(const Data &data);
Data data() const { return m_data; }
bool enableLowerClazyLevels() const; bool enableLowerClazyLevels() const { return m_data.enableLowerClazyLevels; }
void setEnableLowerClazyLevels(bool yesno); PCHUsage pchUsage() const { return m_data.pchUsage; }
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; }
bool categorizeFindReferences() const { return m_data.categorizeFindReferences; }
bool ignoreFiles() const { return m_data.ignoreFiles; }
QString ignorePattern() const { return m_data.ignorePattern; }
PCHUsage pchUsage() const; // FIXME: Doesn't belong here.
void setPCHUsage(PCHUsage pchUsage); void setEnableLowerClazyLevels(bool enable);
bool interpretAmbigiousHeadersAsCHeaders() const; void setCategorizeFindReferences(bool categorize);
void setInterpretAmbigiousHeadersAsCHeaders(bool yesno);
bool skipIndexingBigFiles() const;
void setSkipIndexingBigFiles(bool yesno);
bool useBuiltinPreprocessor() const { return m_useBuiltinPreprocessor; }
void setUseBuiltinPreprocessor(bool useBuiltin) { m_useBuiltinPreprocessor = useBuiltin; }
int indexerFileSizeLimitInMb() const;
void setIndexerFileSizeLimitInMb(int sizeInMB);
void setCategorizeFindReferences(bool categorize) { m_categorizeFindReferences = categorize; }
bool categorizeFindReferences() const { return m_categorizeFindReferences; }
bool ignoreFiles() const;
void setIgnoreFiles(bool ignoreFiles);
QString ignorePattern() const;
void setIgnorePattern(const QString& ignorePattern);
signals: signals:
void changed(); void changed();
private: private:
CppCodeModelSettings() = default; CppCodeModelSettings() = default;
void fromSettings(Utils::QtcSettings *s);
Utils::Store toMap() const;
void fromMap(const Utils::Store &store);
PCHUsage m_pchUsage = PchUse_BuildSystem; void toSettings(Utils::QtcSettings *s);
bool m_interpretAmbigiousHeadersAsCHeaders = false; void fromSettings(Utils::QtcSettings *s);
bool m_skipIndexingBigFiles = true;
bool m_useBuiltinPreprocessor = true; Data m_data;
int m_indexerFileSizeLimitInMB = 5;
bool m_enableLowerClazyLevels = true; // For UI behavior only
bool m_categorizeFindReferences = false; // Ephemeral!
bool m_ignoreFiles = false;
QString m_ignorePattern;
}; };
class CPPEDITOR_EXPORT ClangdSettings : public QObject class CPPEDITOR_EXPORT ClangdSettings : public QObject

View File

@@ -51,14 +51,13 @@ namespace CppEditor::Internal {
class CppCodeModelSettingsWidget final : public Core::IOptionsPageWidget class CppCodeModelSettingsWidget final : public Core::IOptionsPageWidget
{ {
public: public:
CppCodeModelSettingsWidget(); CppCodeModelSettingsWidget(const CppCodeModelSettings::Data &data);
private: private:
void apply() final; void apply() final { codeModelSettings()->setData(data()); }
bool applyGeneralWidgetsToSettings() const; CppCodeModelSettings::Data data() const;
CppCodeModelSettings *m_settings = nullptr;
QCheckBox *m_interpretAmbiguousHeadersAsCHeaders; QCheckBox *m_interpretAmbiguousHeadersAsCHeaders;
QCheckBox *m_ignorePchCheckBox; QCheckBox *m_ignorePchCheckBox;
QCheckBox *m_useBuiltinPreprocessorCheckBox; QCheckBox *m_useBuiltinPreprocessorCheckBox;
@@ -68,19 +67,18 @@ private:
QPlainTextEdit *m_ignorePatternTextEdit; QPlainTextEdit *m_ignorePatternTextEdit;
}; };
CppCodeModelSettingsWidget::CppCodeModelSettingsWidget() CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(const CppCodeModelSettings::Data &data)
: m_settings(&cppCodeModelSettings())
{ {
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(m_settings->skipIndexingBigFiles()); m_skipIndexingBigFilesCheckBox->setChecked(data.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(m_settings->indexerFileSizeLimitInMb()); m_bigFilesLimitSpinBox->setValue(data.indexerFileSizeLimitInMb);
m_ignoreFilesCheckBox = new QCheckBox(Tr::tr("Ignore files")); m_ignoreFilesCheckBox = new QCheckBox(Tr::tr("Ignore files"));
m_ignoreFilesCheckBox->setToolTip( m_ignoreFilesCheckBox->setToolTip(
@@ -88,8 +86,8 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget()
+ 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(m_settings->ignoreFiles()); m_ignoreFilesCheckBox->setChecked(data.ignoreFiles);
m_ignorePatternTextEdit = new QPlainTextEdit(m_settings->ignorePattern()); m_ignorePatternTextEdit = new QPlainTextEdit(data.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());
@@ -109,11 +107,9 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget()
(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( m_interpretAmbiguousHeadersAsCHeaders->setChecked(data.interpretAmbigiousHeadersAsC);
m_settings->interpretAmbigiousHeadersAsCHeaders()); m_ignorePchCheckBox->setChecked(data.pchUsage == CppCodeModelSettings::PchUse_None);
m_useBuiltinPreprocessorCheckBox->setChecked(data.useBuiltinPreprocessor);
m_ignorePchCheckBox->setChecked(m_settings->pchUsage() == CppCodeModelSettings::PchUse_None);
m_useBuiltinPreprocessorCheckBox->setChecked(m_settings->useBuiltinPreprocessor());
using namespace Layouting; using namespace Layouting;
@@ -132,61 +128,18 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget()
}.attachTo(this); }.attachTo(this);
} }
void CppCodeModelSettingsWidget::apply() CppCodeModelSettings::Data CppCodeModelSettingsWidget::data() const
{ {
if (applyGeneralWidgetsToSettings()) CppCodeModelSettings::Data data;
m_settings->toSettings(Core::ICore::settings()); data.interpretAmbigiousHeadersAsC = m_interpretAmbiguousHeadersAsCHeaders->isChecked();
} data.skipIndexingBigFiles = m_skipIndexingBigFilesCheckBox->isChecked();
data.useBuiltinPreprocessor = m_useBuiltinPreprocessorCheckBox->isChecked();
bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const data.ignoreFiles = m_ignoreFilesCheckBox->isChecked();
{ data.ignorePattern = m_ignorePatternTextEdit->toPlainText();
bool settingsChanged = false; data.indexerFileSizeLimitInMb = m_bigFilesLimitSpinBox->value();
data.pchUsage = m_ignorePchCheckBox->isChecked() ? CppCodeModelSettings::PchUse_None
const bool newInterpretAmbiguousHeaderAsCHeaders
= m_interpretAmbiguousHeadersAsCHeaders->isChecked();
if (m_settings->interpretAmbigiousHeadersAsCHeaders()
!= newInterpretAmbiguousHeaderAsCHeaders) {
m_settings->setInterpretAmbigiousHeadersAsCHeaders(newInterpretAmbiguousHeaderAsCHeaders);
settingsChanged = true;
}
const bool newSkipIndexingBigFiles = m_skipIndexingBigFilesCheckBox->isChecked();
if (m_settings->skipIndexingBigFiles() != newSkipIndexingBigFiles) {
m_settings->setSkipIndexingBigFiles(newSkipIndexingBigFiles);
settingsChanged = true;
}
const bool newUseBuiltinPreprocessor = m_useBuiltinPreprocessorCheckBox->isChecked();
if (m_settings->useBuiltinPreprocessor() != newUseBuiltinPreprocessor) {
m_settings->setUseBuiltinPreprocessor(newUseBuiltinPreprocessor);
settingsChanged = true;
}
const bool ignoreFiles = m_ignoreFilesCheckBox->isChecked();
if (m_settings->ignoreFiles() != ignoreFiles) {
m_settings->setIgnoreFiles(ignoreFiles);
settingsChanged = true;
}
const QString ignorePattern = m_ignorePatternTextEdit->toPlainText();
if (m_settings->ignorePattern() != ignorePattern) {
m_settings->setIgnorePattern(ignorePattern);
settingsChanged = true;
}
const int newFileSizeLimit = m_bigFilesLimitSpinBox->value();
if (m_settings->indexerFileSizeLimitInMb() != newFileSizeLimit) {
m_settings->setIndexerFileSizeLimitInMb(newFileSizeLimit);
settingsChanged = true;
}
const bool newIgnorePch = m_ignorePchCheckBox->isChecked();
const bool previousIgnorePch = m_settings->pchUsage() == CppCodeModelSettings::PchUse_None;
if (newIgnorePch != previousIgnorePch) {
const CppCodeModelSettings::PCHUsage pchUsage = m_ignorePchCheckBox->isChecked()
? CppCodeModelSettings::PchUse_None
: CppCodeModelSettings::PchUse_BuildSystem; : CppCodeModelSettings::PchUse_BuildSystem;
m_settings->setPCHUsage(pchUsage); return data;
settingsChanged = true;
}
return settingsChanged;
} }
class CppCodeModelSettingsPage final : public Core::IOptionsPage class CppCodeModelSettingsPage final : public Core::IOptionsPage
@@ -199,7 +152,7 @@ public:
setCategory(Constants::CPP_SETTINGS_CATEGORY); setCategory(Constants::CPP_SETTINGS_CATEGORY);
setDisplayCategory(Tr::tr("C++")); setDisplayCategory(Tr::tr("C++"));
setCategoryIconPath(":/projectexplorer/images/settingscategory_cpp.png"); setCategoryIconPath(":/projectexplorer/images/settingscategory_cpp.png");
setWidgetCreator([] { return new CppCodeModelSettingsWidget; }); setWidgetCreator([] { return new CppCodeModelSettingsWidget(codeModelSettings()->data()); });
} }
}; };