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>
This commit is contained in:
Philip Van Hoof
2022-10-14 17:27:14 +02:00
parent 001d55e1f0
commit 55b8ab7846
5 changed files with 105 additions and 5 deletions

View File

@@ -45,6 +45,12 @@ static QString interpretAmbiguousHeadersAsCHeadersKey()
static QString skipIndexingBigFilesKey() static QString skipIndexingBigFilesKey()
{ return QLatin1String(Constants::CPPEDITOR_SKIP_INDEXING_BIG_FILES); } { 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() static QString useBuiltinPreprocessorKey()
{ return QLatin1String(Constants::CPPEDITOR_USE_BUILTIN_PREPROCESSOR); } { return QLatin1String(Constants::CPPEDITOR_USE_BUILTIN_PREPROCESSOR); }
@@ -91,6 +97,12 @@ void CppCodeModelSettings::fromSettings(QSettings *s)
const QVariant skipIndexingBigFiles = s->value(skipIndexingBigFilesKey(), true); const QVariant skipIndexingBigFiles = s->value(skipIndexingBigFilesKey(), true);
setSkipIndexingBigFiles(skipIndexingBigFiles.toBool()); 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()); setUseBuiltinPreprocessor(s->value(useBuiltinPreprocessorKey(), true).toBool());
const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5); const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5);
@@ -110,6 +122,8 @@ void CppCodeModelSettings::toSettings(QSettings *s)
s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders()); s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders());
s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles());
s->setValue(ignoreFilesKey(), ignoreFiles());
s->setValue(ignorePatternKey(), QVariant(ignorePattern()));
s->setValue(useBuiltinPreprocessorKey(), useBuiltinPreprocessor()); s->setValue(useBuiltinPreprocessorKey(), useBuiltinPreprocessor());
s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb());
@@ -158,6 +172,27 @@ void CppCodeModelSettings::setIndexerFileSizeLimitInMb(int sizeInMB)
m_indexerFileSizeLimitInMB = 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 bool CppCodeModelSettings::enableLowerClazyLevels() const
{ {
return m_enableLowerClazyLevels; return m_enableLowerClazyLevels;

View File

@@ -57,6 +57,11 @@ public:
void setCategorizeFindReferences(bool categorize) { m_categorizeFindReferences = categorize; } void setCategorizeFindReferences(bool categorize) { m_categorizeFindReferences = categorize; }
bool categorizeFindReferences() const { return m_categorizeFindReferences; } bool categorizeFindReferences() const { return m_categorizeFindReferences; }
bool ignoreFiles() const;
void setIgnoreFiles(bool ignoreFiles);
QString ignorePattern() const;
void setIgnorePattern(const QString& ignorePattern);
signals: signals:
void clangDiagnosticConfigsInvalidated(const QVector<Utils::Id> &configId); void clangDiagnosticConfigsInvalidated(const QVector<Utils::Id> &configId);
void changed(); void changed();
@@ -69,6 +74,8 @@ private:
int m_indexerFileSizeLimitInMB = 5; int m_indexerFileSizeLimitInMB = 5;
bool m_enableLowerClazyLevels = true; // For UI behavior only bool m_enableLowerClazyLevels = true; // For UI behavior only
bool m_categorizeFindReferences = false; // Ephemeral! 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

@@ -31,6 +31,7 @@
#include <QTextStream> #include <QTextStream>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QVersionNumber> #include <QVersionNumber>
#include <QTextBlock>
#include <limits> #include <limits>
@@ -54,6 +55,8 @@ private:
QCheckBox *m_useBuiltinPreprocessorCheckBox; QCheckBox *m_useBuiltinPreprocessorCheckBox;
QCheckBox *m_skipIndexingBigFilesCheckBox; QCheckBox *m_skipIndexingBigFilesCheckBox;
QSpinBox *m_bigFilesLimitSpinBox; QSpinBox *m_bigFilesLimitSpinBox;
QCheckBox *m_ignoreFilesCheckBox;
QPlainTextEdit *m_ignorePatternTextEdit;
}; };
CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s) CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s)
@@ -70,6 +73,19 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(CppCodeModelSettings *s)
m_bigFilesLimitSpinBox->setRange(1, 500); m_bigFilesLimitSpinBox->setRange(1, 500);
m_bigFilesLimitSpinBox->setValue(m_settings->indexerFileSizeLimitInMb()); 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 = new QCheckBox(tr("Ignore precompiled headers"));
m_ignorePchCheckBox->setToolTip(tr( m_ignorePchCheckBox->setToolTip(tr(
"<html><head/><body><p>When precompiled headers are not ignored, the parsing for code " "<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_ignorePchCheckBox,
m_useBuiltinPreprocessorCheckBox, m_useBuiltinPreprocessorCheckBox,
Row { m_skipIndexingBigFilesCheckBox, m_bigFilesLimitSpinBox, st }, Row { m_skipIndexingBigFilesCheckBox, m_bigFilesLimitSpinBox, st },
Row { Column { m_ignoreFilesCheckBox, st }, m_ignorePatternTextEdit },
} }
}, },
st st
@@ -132,6 +149,16 @@ bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const
m_settings->setUseBuiltinPreprocessor(newUseBuiltinPreprocessor); m_settings->setUseBuiltinPreprocessor(newUseBuiltinPreprocessor);
settingsChanged = true; 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(); const int newFileSizeLimit = m_bigFilesLimitSpinBox->value();
if (m_settings->indexerFileSizeLimitInMb() != newFileSizeLimit) { if (m_settings->indexerFileSizeLimitInMb() != newFileSizeLimit) {
m_settings->setIndexerFileSizeLimitInMb(newFileSizeLimit); m_settings->setIndexerFileSizeLimitInMb(newFileSizeLimit);

View File

@@ -89,6 +89,8 @@ const char CPPEDITOR_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[]
const char CPPEDITOR_USE_BUILTIN_PREPROCESSOR[] = "UseBuiltinPreprocessor"; const char CPPEDITOR_USE_BUILTIN_PREPROCESSOR[] = "UseBuiltinPreprocessor";
const char CPPEDITOR_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; const char CPPEDITOR_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles";
const char CPPEDITOR_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; 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_QUESTIONABLE[] = "Builtin.Questionable";
const char CPP_CLANG_DIAG_CONFIG_BUILDSYSTEM[] = "Builtin.BuildSystem"; const char CPP_CLANG_DIAG_CONFIG_BUILDSYSTEM[] = "Builtin.BuildSystem";

View File

@@ -69,6 +69,8 @@
#include <QMutexLocker> #include <QMutexLocker>
#include <QReadLocker> #include <QReadLocker>
#include <QReadWriteLock> #include <QReadWriteLock>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QTextBlock> #include <QTextBlock>
#include <QThreadPool> #include <QThreadPool>
#include <QTimer> #include <QTimer>
@@ -1050,19 +1052,44 @@ CppLocatorData *CppModelManager::locatorData() const
return &d->m_locatorData; 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; return files;
QSet<QString> result; QSet<QString> result;
QFileInfo fileInfo; 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) { for (const QString &filePath : files) {
fileInfo.setFile(filePath); fileInfo.setFile(filePath);
if (fileSizeExceedsLimit(fileInfo, fileSizeLimitInMb)) if (fileSizeLimitInMb > 0 && fileSizeExceedsLimit(fileInfo, fileSizeLimitInMb))
continue; 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;
}
}
}
if (!skip)
result << filePath; result << filePath;
} }
@@ -1075,7 +1102,9 @@ QFuture<void> CppModelManager::updateSourceFiles(const QSet<QString> &sourceFile
if (sourceFiles.isEmpty() || !d->m_indexerEnabled) if (sourceFiles.isEmpty() || !d->m_indexerEnabled)
return QFuture<void>(); 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); return d->m_internalIndexingSupport->refreshSourceFiles(filteredFiles, mode);
} }