diff options
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 28 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsourceprocessor.cpp | 6 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsreuse.cpp | 30 | ||||
-rw-r--r-- | 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 <coreplugin/documentmanager.h> @@ -585,15 +586,38 @@ QByteArray CppModelManager::codeModelConfiguration() const return QByteArray::fromRawData(pp_configuration, qstrlen(pp_configuration)); } +static QSet<QString> tooBigFilesRemoved(const QSet<QString> &files, int fileSizeLimit) +{ + if (fileSizeLimit == 0) + return files; + + QSet<QString> result; + QFileInfo fileInfo; + + QSetIterator<QString> i(files); + while (i.hasNext()) { + const QString filePath = i.next(); + fileInfo.setFile(filePath); + if (skipFileDueToSizeLimit(fileInfo), fileSizeLimit) + continue; + + result << filePath; + } + + return result; +} + QFuture<void> CppModelManager::updateSourceFiles(const QSet<QString> &sourceFiles, ProgressNotificationMode mode) { if (sourceFiles.isEmpty() || !d->m_indexerEnabled) return QFuture<void>(); + 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<ProjectInfo> 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 <coreplugin/editormanager/editormanager.h> @@ -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 <cplusplus/LookupContext.h> #include <utils/qtcassert.h> +#include <QDebug> #include <QSet> #include <QStringRef> #include <QTextCursor> @@ -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 |