From 83ea1f4deb4f5752f4eb1e36664761a7cdc79a9e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 16 Aug 2016 13:37:49 +0200 Subject: [PATCH] CppTools: Add UI for file size limit of indexer Task-number: QTCREATORBUG-16712 Change-Id: I92db8cbcac9669cbd5e4ee5f7ef6f613797c753a Reviewed-by: David Schulz Reviewed-by: Orgad Shaneh --- .../cpptools/builtinindexingsupport.cpp | 4 ++ src/plugins/cpptools/cppcodemodelsettings.cpp | 35 +++++++++++++++ src/plugins/cpptools/cppcodemodelsettings.h | 8 ++++ .../cpptools/cppcodemodelsettingspage.cpp | 27 +++++++++++ .../cpptools/cppcodemodelsettingspage.h | 2 + .../cpptools/cppcodemodelsettingspage.ui | 45 ++++++++++++++++++- src/plugins/cpptools/cppmodelmanager.cpp | 8 ++-- src/plugins/cpptools/cppsourceprocessor.cpp | 7 ++- src/plugins/cpptools/cppsourceprocessor.h | 2 + src/plugins/cpptools/cpptoolsconstants.h | 2 + src/plugins/cpptools/cpptoolsreuse.cpp | 34 +++++++------- src/plugins/cpptools/cpptoolsreuse.h | 4 +- 12 files changed, 155 insertions(+), 23 deletions(-) diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp index b2fc32159d9..de9a0c81ca4 100644 --- a/src/plugins/cpptools/builtinindexingsupport.cpp +++ b/src/plugins/cpptools/builtinindexingsupport.cpp @@ -32,6 +32,7 @@ #include "cppsourceprocessor.h" #include "cpptoolsconstants.h" #include "cpptoolsplugin.h" +#include "cpptoolsreuse.h" #include "searchsymbols.h" #include @@ -59,6 +60,7 @@ public: ProjectPartHeaderPaths headerPaths; WorkingCopy workingCopy; QSet sourceFiles; + int indexerFileSizeLimitInMb = -1; }; class WriteTaskFileForDiagnostics @@ -179,6 +181,7 @@ void indexFindErrors(QFutureInterface &future, const ParseParams params) void index(QFutureInterface &future, const ParseParams params) { QScopedPointer sourceProcessor(CppModelManager::createSourceProcessor()); + sourceProcessor->setFileSizeLimitInMb(params.indexerFileSizeLimitInMb); sourceProcessor->setHeaderPaths(params.headerPaths); sourceProcessor->setWorkingCopy(params.workingCopy); @@ -349,6 +352,7 @@ QFuture BuiltinIndexingSupport::refreshSourceFiles(const QSet &so CppModelManager *mgr = CppModelManager::instance(); ParseParams params; + params.indexerFileSizeLimitInMb = indexerFileSizeLimitInMb(); params.headerPaths = mgr->headerPaths(); params.workingCopy = mgr->workingCopy(); params.sourceFiles = sourceFiles; diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index 724d45564c9..43d8e5f8122 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -58,6 +58,12 @@ static QString clangDiagnosticConfigsArrayOptionsKey() static QString pchUsageKey() { return QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE); } +static QString skipIndexingBigFilesKey() +{ return QLatin1String(Constants::CPPTOOLS_SKIP_INDEXING_BIG_FILES); } + +static QString indexerFileSizeLimitKey() +{ return QLatin1String(Constants::CPPTOOLS_INDEXER_FILE_SIZE_LIMIT); } + void CppCodeModelSettings::fromSettings(QSettings *s) { s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); @@ -81,6 +87,13 @@ void CppCodeModelSettings::fromSettings(QSettings *s) const QVariant pchUsageVariant = s->value(pchUsageKey(), initialPchUsage()); setPCHUsage(static_cast(pchUsageVariant.toInt())); + + const QVariant skipIndexingBigFiles = s->value(skipIndexingBigFilesKey(), true); + setSkipIndexingBigFiles(skipIndexingBigFiles.toBool()); + + const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5); + setIndexerFileSizeLimitInMb(indexerFileSizeLimit.toInt()); + s->endGroup(); emit changed(); @@ -103,6 +116,8 @@ void CppCodeModelSettings::toSettings(QSettings *s) s->setValue(clangDiagnosticConfigKey(), clangDiagnosticConfigId().toSetting()); s->setValue(pchUsageKey(), pchUsage()); + s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); + s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); s->endGroup(); @@ -150,3 +165,23 @@ void CppCodeModelSettings::emitChanged() { emit changed(); } + +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; +} diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index 92a212f8a8d..c57ee8bbc41 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -63,6 +63,12 @@ public: PCHUsage pchUsage() const; void setPCHUsage(PCHUsage pchUsage); + bool skipIndexingBigFiles() const; + void setSkipIndexingBigFiles(bool yesno); + + int indexerFileSizeLimitInMb() const; + void setIndexerFileSizeLimitInMb(int sizeInMB); + public: // for tests void emitChanged(); @@ -72,6 +78,8 @@ signals: private: PCHUsage m_pchUsage = PchUse_None; + bool m_skipIndexingBigFiles = true; + int m_indexerFileSizeLimitInMB = 5; ClangDiagnosticConfigs m_clangCustomDiagnosticConfigs; Core::Id m_clangDiagnosticConfigId; }; diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.cpp b/src/plugins/cpptools/cppcodemodelsettingspage.cpp index 8fb52b72ccb..c3addc400b1 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp +++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp @@ -58,6 +58,7 @@ void CppCodeModelSettingsWidget::setSettings(const QSharedPointertoSettings(Core::ICore::settings()); @@ -92,6 +94,12 @@ void CppCodeModelSettingsWidget::setupPchCheckBox() const m_ui->ignorePCHCheckBox->setChecked(ignorePch); } +void CppCodeModelSettingsWidget::setupSkipIndexingFilesWidgets() +{ + m_ui->skipIndexingBigFilesCheckBox->setChecked(m_settings->skipIndexingBigFiles()); + m_ui->bigFilesLimitSpinBox->setValue(m_settings->indexerFileSizeLimitInMb()); +} + bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const { bool settingsChanged = false; @@ -131,6 +139,25 @@ bool CppCodeModelSettingsWidget::applyPchCheckBoxToSettings() const return false; } +bool CppCodeModelSettingsWidget::applySkipIndexingFilesWidgets() const +{ + bool settingsChanged = false; + + const bool newSkipIndexingBigFiles = m_ui->skipIndexingBigFilesCheckBox->isChecked(); + if (m_settings->skipIndexingBigFiles() != newSkipIndexingBigFiles) { + m_settings->setSkipIndexingBigFiles(newSkipIndexingBigFiles); + settingsChanged = true; + } + + const int newFileSizeLimit = m_ui->bigFilesLimitSpinBox->value(); + if (m_settings->indexerFileSizeLimitInMb() != newFileSizeLimit) { + m_settings->setIndexerFileSizeLimitInMb(newFileSizeLimit); + settingsChanged = true; + } + + return settingsChanged; +} + CppCodeModelSettingsPage::CppCodeModelSettingsPage(QSharedPointer &settings, QObject *parent) : Core::IOptionsPage(parent) diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.h b/src/plugins/cpptools/cppcodemodelsettingspage.h index 6641c7898c8..fc249d4285b 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.h +++ b/src/plugins/cpptools/cppcodemodelsettingspage.h @@ -57,9 +57,11 @@ public: private: void setupClangCodeModelWidgets(); void setupPchCheckBox() const; + void setupSkipIndexingFilesWidgets(); bool applyClangCodeModelWidgetsToSettings() const; bool applyPchCheckBoxToSettings() const; + bool applySkipIndexingFilesWidgets() const; private: Ui::CppCodeModelSettingsPage *m_ui; diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.ui b/src/plugins/cpptools/cppcodemodelsettingspage.ui index 23ee9e764ec..34a946854b0 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.ui +++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui @@ -42,7 +42,7 @@ - Pre-compiled Headers + Files to Skip @@ -55,6 +55,49 @@ + + + + + + Do not index files greater than + + + true + + + + + + + MB + + + 1 + + + 500 + + + 5 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index d7e319d80f9..ac0003e3dd6 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -611,9 +611,9 @@ QByteArray CppModelManager::codeModelConfiguration() const return QByteArray::fromRawData(pp_configuration, qstrlen(pp_configuration)); } -static QSet tooBigFilesRemoved(const QSet &files, int fileSizeLimit) +static QSet tooBigFilesRemoved(const QSet &files, int fileSizeLimitInMb) { - if (fileSizeLimit == 0) + if (fileSizeLimitInMb <= 0) return files; QSet result; @@ -623,7 +623,7 @@ static QSet tooBigFilesRemoved(const QSet &files, int fileSize while (i.hasNext()) { const QString filePath = i.next(); fileInfo.setFile(filePath); - if (skipFileDueToSizeLimit(fileInfo, fileSizeLimit)) + if (fileSizeExceedsLimit(fileInfo, fileSizeLimitInMb)) continue; result << filePath; @@ -638,7 +638,7 @@ QFuture CppModelManager::updateSourceFiles(const QSet &sourceFile if (sourceFiles.isEmpty() || !d->m_indexerEnabled) return QFuture(); - const auto filteredFiles = tooBigFilesRemoved(sourceFiles, fileSizeLimit()); + const QSet filteredFiles = tooBigFilesRemoved(sourceFiles, indexerFileSizeLimitInMb()); if (d->m_indexingSupporter) d->m_indexingSupporter->refreshSourceFiles(filteredFiles, mode); diff --git a/src/plugins/cpptools/cppsourceprocessor.cpp b/src/plugins/cpptools/cppsourceprocessor.cpp index e04d977ebf1..89da0a02ad3 100644 --- a/src/plugins/cpptools/cppsourceprocessor.cpp +++ b/src/plugins/cpptools/cppsourceprocessor.cpp @@ -448,7 +448,7 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In } const QFileInfo info(absoluteFileName); - if (skipFileDueToSizeLimit(info)) + if (fileSizeExceedsLimit(info, m_fileSizeLimitInMb)) return; // TODO: Add diagnostic message // Otherwise get file contents @@ -505,6 +505,11 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In switchCurrentDocument(previousDocument); } +void CppSourceProcessor::setFileSizeLimitInMb(int fileSizeLimitInMb) +{ + m_fileSizeLimitInMb = fileSizeLimitInMb; +} + Document::Ptr CppSourceProcessor::switchCurrentDocument(Document::Ptr doc) { const Document::Ptr previousDoc = m_currentDoc; diff --git a/src/plugins/cpptools/cppsourceprocessor.h b/src/plugins/cpptools/cppsourceprocessor.h index 84ea0343472..7cca70b1dd7 100644 --- a/src/plugins/cpptools/cppsourceprocessor.h +++ b/src/plugins/cpptools/cppsourceprocessor.h @@ -65,6 +65,7 @@ public: void setWorkingCopy(const CppTools::WorkingCopy &workingCopy); void setHeaderPaths(const ProjectPartHeaderPaths &headerPaths); void setLanguageFeatures(CPlusPlus::LanguageFeatures languageFeatures); + void setFileSizeLimitInMb(int fileSizeLimitInMb); void setTodo(const QSet &files); void run(const QString &fileName, const QStringList &initialIncludes = QStringList()); @@ -122,6 +123,7 @@ private: QSet m_todo; QSet m_processed; QHash m_fileNameCache; + int m_fileSizeLimitInMb = -1; QTextCodec *m_defaultCodec; }; diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 18c7a352f81..b82ecad14e2 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -50,6 +50,8 @@ const char LOWERCASE_CPPFILES_KEY[] = "LowerCaseFiles"; enum { lowerCaseFilesDefault = 1 }; const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview"; const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage"; +const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; +const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] = "Builtin.EverythingWithExceptions"; diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp index f544c165f5d..7a21b4c6da6 100644 --- a/src/plugins/cpptools/cpptoolsreuse.cpp +++ b/src/plugins/cpptools/cpptoolsreuse.cpp @@ -25,11 +25,13 @@ #include "cpptoolsreuse.h" +#include "cppcodemodelsettings.h" #include "cpptoolsplugin.h" #include #include #include +#include #include #include @@ -255,29 +257,31 @@ QSharedPointer codeModelSettings() return CppTools::Internal::CppToolsPlugin::instance()->codeModelSettings(); } -int fileSizeLimit() +int indexerFileSizeLimitInMb() { - static const QByteArray fileSizeLimitAsByteArray = qgetenv("QTC_CPP_FILE_SIZE_LIMIT_MB"); - static int fileSizeLimitAsInt = -1; + const QSharedPointer settings = codeModelSettings(); + QTC_ASSERT(settings, return -1); - if (fileSizeLimitAsInt == -1) { - bool ok; - const int limit = fileSizeLimitAsByteArray.toInt(&ok); - fileSizeLimitAsInt = ok && limit >= 0 ? limit : 0; - } + if (settings->skipIndexingBigFiles()) + return settings->indexerFileSizeLimitInMb(); - return fileSizeLimitAsInt; + return -1; } -bool skipFileDueToSizeLimit(const QFileInfo &fileInfo, int limitInMB) +bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb) { - if (limitInMB == 0) // unlimited + if (sizeLimitInMb <= 0) return false; - const int fileSizeInMB = fileInfo.size() / (1000 * 1000); - if (fileSizeInMB > limitInMB) { - qWarning() << "Files to process limited by QTC_CPP_FILE_SIZE_LIMIT_MB, skipping" - << fileInfo.absoluteFilePath(); + const qint64 fileSizeInMB = fileInfo.size() / (1000 * 1000); + if (fileSizeInMB > sizeLimitInMb) { + const QString absoluteFilePath = fileInfo.absoluteFilePath(); + const QString msg = QCoreApplication::translate( + "CppIndexer", + "C++ Indexer: Skipping file \"%1\" because it is too big.") + .arg(absoluteFilePath); + Core::MessageManager::write(msg, Core::MessageManager::Silent); + qWarning().noquote() << msg; return true; } diff --git a/src/plugins/cpptools/cpptoolsreuse.h b/src/plugins/cpptools/cpptoolsreuse.h index cdb86bd5659..b60eceeb64c 100644 --- a/src/plugins/cpptools/cpptoolsreuse.h +++ b/src/plugins/cpptools/cpptoolsreuse.h @@ -72,7 +72,7 @@ void CPPTOOLS_EXPORT switchHeaderSource(); class CppCodeModelSettings; QSharedPointer CPPTOOLS_EXPORT codeModelSettings(); -int fileSizeLimit(); -bool skipFileDueToSizeLimit(const QFileInfo &fileInfo, int limitInMB = fileSizeLimit()); +int indexerFileSizeLimitInMb(); +bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb); } // CppTools