From 1960503ae994d14d79bad6507f2ed692e5c2230d Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 12 May 2015 14:20:32 +0200 Subject: CppTools: Allow to limit the files to process by file size ...with the environment variable QTC_CPP_FILE_SIZE_LIMIT_MB. Task-number: QTCREATORBUG-14390 Change-Id: Iaefaa1a3db023b58f9351b96e1b9e2139797e280 Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppmodelmanager.cpp | 28 +++++++++++++++++++++++++-- src/plugins/cpptools/cppsourceprocessor.cpp | 6 +++++- src/plugins/cpptools/cpptoolsreuse.cpp | 30 +++++++++++++++++++++++++++++ src/plugins/cpptools/cpptoolsreuse.h | 4 ++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 9fd0a82909..fbf5760df7 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -42,6 +42,7 @@ #include "cppsourceprocessor.h" #include "cpptoolsconstants.h" #include "cpptoolsplugin.h" +#include "cpptoolsreuse.h" #include "editordocumenthandle.h" #include @@ -585,15 +586,38 @@ QByteArray CppModelManager::codeModelConfiguration() const return QByteArray::fromRawData(pp_configuration, qstrlen(pp_configuration)); } +static QSet tooBigFilesRemoved(const QSet &files, int fileSizeLimit) +{ + if (fileSizeLimit == 0) + return files; + + QSet result; + QFileInfo fileInfo; + + QSetIterator i(files); + while (i.hasNext()) { + const QString filePath = i.next(); + fileInfo.setFile(filePath); + if (skipFileDueToSizeLimit(fileInfo), fileSizeLimit) + continue; + + result << filePath; + } + + return result; +} + QFuture CppModelManager::updateSourceFiles(const QSet &sourceFiles, ProgressNotificationMode mode) { if (sourceFiles.isEmpty() || !d->m_indexerEnabled) return QFuture(); + const auto filteredFiles = tooBigFilesRemoved(sourceFiles, fileSizeLimit()); + if (d->m_indexingSupporter) - d->m_indexingSupporter->refreshSourceFiles(sourceFiles, mode); - return d->m_internalIndexingSupport->refreshSourceFiles(sourceFiles, mode); + d->m_indexingSupporter->refreshSourceFiles(filteredFiles, mode); + return d->m_internalIndexingSupport->refreshSourceFiles(filteredFiles, mode); } QList CppModelManager::projectInfos() const diff --git a/src/plugins/cpptools/cppsourceprocessor.cpp b/src/plugins/cpptools/cppsourceprocessor.cpp index 4f292c0a34..036435d692 100644 --- a/src/plugins/cpptools/cppsourceprocessor.cpp +++ b/src/plugins/cpptools/cppsourceprocessor.cpp @@ -31,6 +31,7 @@ #include "cppsourceprocessor.h" #include "cppmodelmanager.h" +#include "cpptoolsreuse.h" #include @@ -454,6 +455,10 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In return; } + const QFileInfo info(absoluteFileName); + if (skipFileDueToSizeLimit(info)) + return; // TODO: Add diagnostic message + // Otherwise get file contents unsigned editorRevision = 0; QByteArray contents; @@ -473,7 +478,6 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In Document::Include inc(include, include, 0, IncludeLocal); document->addIncludeFile(inc); } - const QFileInfo info(absoluteFileName); if (info.exists()) document->setLastModified(info.lastModified()); diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp index 77d2ade298..7814553339 100644 --- a/src/plugins/cpptools/cpptoolsreuse.cpp +++ b/src/plugins/cpptools/cpptoolsreuse.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -250,4 +251,33 @@ TextEditor::TextEditorWidget::Link linkToSymbol(Symbol *symbol) return Link(filename, line, column); } +int fileSizeLimit() +{ + static const QByteArray fileSizeLimitAsByteArray = qgetenv("QTC_CPP_FILE_SIZE_LIMIT_MB"); + static int fileSizeLimitAsInt = -1; + + if (fileSizeLimitAsInt == -1) { + bool ok; + const int limit = fileSizeLimitAsByteArray.toInt(&ok); + fileSizeLimitAsInt = ok && limit >= 0 ? limit : 0; + } + + return fileSizeLimitAsInt; +} + +bool skipFileDueToSizeLimit(const QFileInfo &fileInfo, int limitInMB) +{ + if (limitInMB == 0) // unlimited + 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(); + return true; + } + + return false; +} + } // CppTools diff --git a/src/plugins/cpptools/cpptoolsreuse.h b/src/plugins/cpptools/cpptoolsreuse.h index 8881c6198a..f8954111c0 100644 --- a/src/plugins/cpptools/cpptoolsreuse.h +++ b/src/plugins/cpptools/cpptoolsreuse.h @@ -39,6 +39,7 @@ QT_BEGIN_NAMESPACE class QChar; +class QFileInfo; class QStringRef; class QTextCursor; QT_END_NAMESPACE @@ -74,6 +75,9 @@ const CPlusPlus::Macro CPPTOOLS_EXPORT *findCanonicalMacro(const QTextCursor &cu QString CPPTOOLS_EXPORT correspondingHeaderOrSource(const QString &fileName, bool *wasHeader = 0); void CPPTOOLS_EXPORT switchHeaderSource(); +int fileSizeLimit(); +bool skipFileDueToSizeLimit(const QFileInfo &fileInfo, int limitInMB = fileSizeLimit()); + } // CppTools #endif // CPPTOOLSREUSE_H -- cgit v1.2.1