diff options
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/builtinindexingsupport.cpp | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.cpp | 35 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.h | 8 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettingspage.cpp | 27 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettingspage.h | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettingspage.ui | 45 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 8 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsourceprocessor.cpp | 7 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsourceprocessor.h | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsconstants.h | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsreuse.cpp | 34 | ||||
-rw-r--r-- | 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 b2fc32159d..de9a0c81ca 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 <coreplugin/icore.h> @@ -59,6 +60,7 @@ public: ProjectPartHeaderPaths headerPaths; WorkingCopy workingCopy; QSet<QString> sourceFiles; + int indexerFileSizeLimitInMb = -1; }; class WriteTaskFileForDiagnostics @@ -179,6 +181,7 @@ void indexFindErrors(QFutureInterface<void> &future, const ParseParams params) void index(QFutureInterface<void> &future, const ParseParams params) { QScopedPointer<CppSourceProcessor> sourceProcessor(CppModelManager::createSourceProcessor()); + sourceProcessor->setFileSizeLimitInMb(params.indexerFileSizeLimitInMb); sourceProcessor->setHeaderPaths(params.headerPaths); sourceProcessor->setWorkingCopy(params.workingCopy); @@ -349,6 +352,7 @@ QFuture<void> BuiltinIndexingSupport::refreshSourceFiles(const QSet<QString> &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 724d45564c..43d8e5f812 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<PCHUsage>(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 92a212f8a8..c57ee8bbc4 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 8fb52b72cc..c3addc400b 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp +++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp @@ -58,6 +58,7 @@ void CppCodeModelSettingsWidget::setSettings(const QSharedPointer<CppCodeModelSe setupClangCodeModelWidgets(); setupPchCheckBox(); + setupSkipIndexingFilesWidgets(); } void CppCodeModelSettingsWidget::applyToSettings() const @@ -66,6 +67,7 @@ void CppCodeModelSettingsWidget::applyToSettings() const changed |= applyClangCodeModelWidgetsToSettings(); changed |= applyPchCheckBoxToSettings(); + changed |= applySkipIndexingFilesWidgets(); if (changed) m_settings->toSettings(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<CppCodeModelSettings> &settings, QObject *parent) : Core::IOptionsPage(parent) diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.h b/src/plugins/cpptools/cppcodemodelsettingspage.h index 6641c7898c..fc249d4285 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 23ee9e764e..34a946854b 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.ui +++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui @@ -42,7 +42,7 @@ <item> <widget class="QGroupBox" name="anotherGroupBox"> <property name="title"> - <string>Pre-compiled Headers</string> + <string>Files to Skip</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -55,6 +55,49 @@ </property> </widget> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QCheckBox" name="skipIndexingBigFilesCheckBox"> + <property name="text"> + <string>Do not index files greater than</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="bigFilesLimitSpinBox"> + <property name="suffix"> + <string>MB</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>500</number> + </property> + <property name="value"> + <number>5</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> </layout> </widget> </item> diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index d7e319d80f..ac0003e3dd 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<QString> tooBigFilesRemoved(const QSet<QString> &files, int fileSizeLimit) +static QSet<QString> tooBigFilesRemoved(const QSet<QString> &files, int fileSizeLimitInMb) { - if (fileSizeLimit == 0) + if (fileSizeLimitInMb <= 0) return files; QSet<QString> result; @@ -623,7 +623,7 @@ static QSet<QString> tooBigFilesRemoved(const QSet<QString> &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<void> CppModelManager::updateSourceFiles(const QSet<QString> &sourceFile if (sourceFiles.isEmpty() || !d->m_indexerEnabled) return QFuture<void>(); - const auto filteredFiles = tooBigFilesRemoved(sourceFiles, fileSizeLimit()); + const QSet<QString> 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 e04d977ebf..89da0a02ad 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 84ea034347..7cca70b1dd 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<QString> &files); void run(const QString &fileName, const QStringList &initialIncludes = QStringList()); @@ -122,6 +123,7 @@ private: QSet<QString> m_todo; QSet<QString> m_processed; QHash<QString, QString> m_fileNameCache; + int m_fileSizeLimitInMb = -1; QTextCodec *m_defaultCodec; }; diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 18c7a352f8..b82ecad14e 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 f544c165f5..7a21b4c6da 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 <coreplugin/documentmanager.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/idocument.h> +#include <coreplugin/messagemanager.h> #include <texteditor/convenience.h> #include <cplusplus/Overview.h> @@ -255,29 +257,31 @@ QSharedPointer<CppCodeModelSettings> 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<CppCodeModelSettings> 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 cdb86bd565..b60eceeb64 100644 --- a/src/plugins/cpptools/cpptoolsreuse.h +++ b/src/plugins/cpptools/cpptoolsreuse.h @@ -72,7 +72,7 @@ void CPPTOOLS_EXPORT switchHeaderSource(); class CppCodeModelSettings; QSharedPointer<CppCodeModelSettings> CPPTOOLS_EXPORT codeModelSettings(); -int fileSizeLimit(); -bool skipFileDueToSizeLimit(const QFileInfo &fileInfo, int limitInMB = fileSizeLimit()); +int indexerFileSizeLimitInMb(); +bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb); } // CppTools |