forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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";
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user