summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-12 14:20:32 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-13 08:26:52 +0000
commit1960503ae994d14d79bad6507f2ed692e5c2230d (patch)
treedbfeba4388f70ef6dfd4a382ac1d4018bf4e66c2
parentf52170737eb00c825e6e2354b9d99d2c342aa740 (diff)
downloadqt-creator-1960503ae994d14d79bad6507f2ed692e5c2230d.tar.gz
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 <erik.verbruggen@theqtcompany.com>
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp28
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.cpp6
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.cpp30
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.h4
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