diff options
author | Philip Van Hoof <philip@codeminded.be> | 2022-10-14 17:27:14 +0200 |
---|---|---|
committer | Philip Van Hoof <philip@codeminded.be> | 2022-10-25 13:46:02 +0000 |
commit | 55b8ab78460b41ea75fcc549db1ce3a6b9128690 (patch) | |
tree | adf31cbef63971474a0c40737e7418df90970804 /src | |
parent | 001d55e1f0e8676acf4dbd0a309612f4b183f22f (diff) |
cppeditor: make it possible to ignore patterns
Allows the user to ignore certain patterns so that these files wont
be indexed
Fixes: QTCREATORBUG-28313
Change-Id: I2a860a473ca1a267e9fab31436fc98b8f4004484
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cppeditor/cppcodemodelsettings.cpp | 35 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppcodemodelsettings.h | 7 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppcodemodelsettingspage.cpp | 27 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppeditorconstants.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppmodelmanager.cpp | 39 |
5 files changed, 105 insertions, 5 deletions
diff --git a/src/plugins/cppeditor/cppcodemodelsettings.cpp b/src/plugins/cppeditor/cppcodemodelsettings.cpp index 18512cf10c..4bb98af0c3 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettings.cpp @@ -45,6 +45,12 @@ static QString interpretAmbiguousHeadersAsCHeadersKey() static QString skipIndexingBigFilesKey() { return QLatin1String(Constants::CPPEDITOR_SKIP_INDEXING_BIG_FILES); } +static QString ignoreFilesKey() +{ return QLatin1String(Constants::CPPEDITOR_IGNORE_FILES); } + +static QString ignorePatternKey() +{ return QLatin1String(Constants::CPPEDITOR_IGNORE_PATTERN); } + static QString useBuiltinPreprocessorKey() { return QLatin1String(Constants::CPPEDITOR_USE_BUILTIN_PREPROCESSOR); } @@ -91,6 +97,12 @@ void CppCodeModelSettings::fromSettings(QSettings *s) const QVariant skipIndexingBigFiles = s->value(skipIndexingBigFilesKey(), true); setSkipIndexingBigFiles(skipIndexingBigFiles.toBool()); + const QVariant ignoreFiles = s->value(ignoreFilesKey(), false); + setIgnoreFiles(ignoreFiles.toBool()); + + const QVariant ignorePattern = s->value(ignorePatternKey(), ""); + setIgnorePattern(ignorePattern.toString()); + setUseBuiltinPreprocessor(s->value(useBuiltinPreprocessorKey(), true).toBool()); const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5); @@ -110,6 +122,8 @@ void CppCodeModelSettings::toSettings(QSettings *s) s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders()); s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); + s->setValue(ignoreFilesKey(), ignoreFiles()); + s->setValue(ignorePatternKey(), QVariant(ignorePattern())); s->setValue(useBuiltinPreprocessorKey(), useBuiltinPreprocessor()); s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); @@ -158,6 +172,27 @@ 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; diff --git a/src/plugins/cppeditor/cppcodemodelsettings.h b/src/plugins/cppeditor/cppcodemodelsettings.h index cd010eec99..02d480d68e 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.h +++ b/src/plugins/cppeditor/cppcodemodelsettings.h @@ -57,6 +57,11 @@ public: 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: void clangDiagnosticConfigsInvalidated(const QVector<Utils::Id> &configId); void changed(); @@ -69,6 +74,8 @@ private: 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 diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index 476a3dae5c..6454215b4b 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -31,6 +31,7 @@ #include <QTextStream> #include <QVBoxLayout> #include <QVersionNumber> +#include <QTextBlock> #include <limits> @@ -54,6 +55,8 @@ private: QCheckBox *m_useBuiltinPreprocessorCheckBox; QCheckBox *m_skipIndexingBigFilesCheckBox; QSpinBox *m_bigFilesLimitSpinBox; + QCheckBox *m_ignoreFilesCheckBox; + QPlainTextEdit *m_ignorePatternTextEdit; }; CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s) @@ -70,6 +73,19 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s) m_bigFilesLimitSpinBox->setRange(1, 500); m_bigFilesLimitSpinBox->setValue(m_settings->indexerFileSizeLimitInMb()); + m_ignoreFilesCheckBox = new QCheckBox(tr("Ignore files")); + m_ignoreFilesCheckBox->setToolTip(tr( + "<html><head/><body><p>Ignore files that match these wildcard patterns, one wildcard per line.</p></body></html>")); + + m_ignoreFilesCheckBox->setChecked(m_settings->ignoreFiles()); + m_ignorePatternTextEdit = new QPlainTextEdit(m_settings->ignorePattern()); + m_ignorePatternTextEdit->setToolTip(m_ignoreFilesCheckBox->toolTip()); + m_ignorePatternTextEdit->setEnabled(m_ignoreFilesCheckBox->isChecked()); + + connect(m_ignoreFilesCheckBox, &QCheckBox::stateChanged, [this] { + m_ignorePatternTextEdit->setEnabled(m_ignoreFilesCheckBox->isChecked()); + }); + m_ignorePchCheckBox = new QCheckBox(tr("Ignore precompiled headers")); m_ignorePchCheckBox->setToolTip(tr( "<html><head/><body><p>When precompiled headers are not ignored, the parsing for code " @@ -98,6 +114,7 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s) m_ignorePchCheckBox, m_useBuiltinPreprocessorCheckBox, Row { m_skipIndexingBigFilesCheckBox, m_bigFilesLimitSpinBox, st }, + Row { Column { m_ignoreFilesCheckBox, st }, m_ignorePatternTextEdit }, } }, st @@ -132,6 +149,16 @@ bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const 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); diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 0c226f6682..1bb6a2eafe 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -89,6 +89,8 @@ const char CPPEDITOR_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[] const char CPPEDITOR_USE_BUILTIN_PREPROCESSOR[] = "UseBuiltinPreprocessor"; const char CPPEDITOR_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; const char CPPEDITOR_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; +const char CPPEDITOR_IGNORE_FILES[] = "IgnoreFiles"; +const char CPPEDITOR_IGNORE_PATTERN[] = "IgnorePattern"; const char CPP_CLANG_DIAG_CONFIG_QUESTIONABLE[] = "Builtin.Questionable"; const char CPP_CLANG_DIAG_CONFIG_BUILDSYSTEM[] = "Builtin.BuildSystem"; diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index 49e42e3eb5..b702ebabc0 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -69,6 +69,8 @@ #include <QMutexLocker> #include <QReadLocker> #include <QReadWriteLock> +#include <QRegularExpression> +#include <QRegularExpressionMatch> #include <QTextBlock> #include <QThreadPool> #include <QTimer> @@ -1050,20 +1052,45 @@ CppLocatorData *CppModelManager::locatorData() const return &d->m_locatorData; } -static QSet<QString> tooBigFilesRemoved(const QSet<QString> &files, int fileSizeLimitInMb) +static QSet<QString> filteredFilesRemoved(const QSet<QString> &files, int fileSizeLimitInMb, + bool ignoreFiles, + const QString& ignorePattern) { - if (fileSizeLimitInMb <= 0) + if (fileSizeLimitInMb <= 0 && !ignoreFiles) return files; QSet<QString> result; QFileInfo fileInfo; + QList<QRegularExpression> regexes; + const QStringList wildcards = ignorePattern.split('\n'); + + for (const QString &wildcard : wildcards) + regexes.append(QRegularExpression::fromWildcard(wildcard, Qt::CaseInsensitive, + QRegularExpression::UnanchoredWildcardConversion)); for (const QString &filePath : files) { fileInfo.setFile(filePath); - if (fileSizeExceedsLimit(fileInfo, fileSizeLimitInMb)) + if (fileSizeLimitInMb > 0 && fileSizeExceedsLimit(fileInfo, fileSizeLimitInMb)) continue; + bool skip = false; + if (ignoreFiles) { + for (const QRegularExpression &rx: std::as_const(regexes)) { + QRegularExpressionMatch match = rx.match(fileInfo.absoluteFilePath()); + if (match.hasMatch()) { + const QString msg = QCoreApplication::translate( + "CppIndexer", + "C++ Indexer: Skipping file \"%1\" because its path matches the ignore pattern.") + .arg(filePath); + QMetaObject::invokeMethod(Core::MessageManager::instance(), + [msg]() { Core::MessageManager::writeSilently(msg); }); + skip = true; + break; + } + } + } - result << filePath; + if (!skip) + result << filePath; } return result; @@ -1075,7 +1102,9 @@ QFuture<void> CppModelManager::updateSourceFiles(const QSet<QString> &sourceFile if (sourceFiles.isEmpty() || !d->m_indexerEnabled) return QFuture<void>(); - const QSet<QString> filteredFiles = tooBigFilesRemoved(sourceFiles, indexerFileSizeLimitInMb()); + const QSet<QString> filteredFiles = filteredFilesRemoved(sourceFiles, indexerFileSizeLimitInMb(), + codeModelSettings()->ignoreFiles(), + codeModelSettings()->ignorePattern()); return d->m_internalIndexingSupport->refreshSourceFiles(filteredFiles, mode); } |