forked from qt-creator/qt-creator
AutoTest: Speed up parsing for tests
Initial parsing for tests when opening bigger projects was too slow. Try to let the parsing process on more than one file at a time to speed up the whole process. Project before now qtbase ~11min ~4min qtcreator ~2min ~40s Values above may vary depending on the underlying hardware. Change-Id: I77eeb189c82c58fce84ffbac67143ec7fa0adcae Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -45,6 +45,7 @@
|
||||
#include <QFuture>
|
||||
#include <QFutureInterface>
|
||||
#include <QLoggingCategory>
|
||||
#include <QtConcurrent>
|
||||
|
||||
static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.testcodeparser")
|
||||
|
||||
@@ -168,35 +169,42 @@ void TestCodeParser::updateTestTree()
|
||||
// is not (yet) part of the CppModelManager's snapshot
|
||||
static bool parsingHasFailed;
|
||||
|
||||
static bool checkDocumentForTestCode(QFutureInterface<TestParseResultPtr> &futureInterface,
|
||||
const QString &fileName,
|
||||
const QVector<ITestParser *> &parsers)
|
||||
class ParseFileForTest
|
||||
{
|
||||
foreach (ITestParser *currentParser, parsers) {
|
||||
if (futureInterface.isCanceled())
|
||||
return false;
|
||||
if (currentParser->processDocument(futureInterface, fileName))
|
||||
return true;
|
||||
public:
|
||||
ParseFileForTest(QFutureInterface<TestParseResultPtr> futureInterface,
|
||||
const QVector<ITestParser *> &parsers)
|
||||
: m_futureInterface(futureInterface) , m_parsers(parsers)
|
||||
{}
|
||||
|
||||
typedef QString result_type;
|
||||
|
||||
void operator() (const QString &fileName)
|
||||
{
|
||||
foreach (ITestParser *parser, m_parsers) {
|
||||
if (m_futureInterface.isCanceled())
|
||||
return;
|
||||
if (parser->processDocument(m_futureInterface, fileName))
|
||||
break;
|
||||
}
|
||||
m_futureInterface.setProgressValue(m_futureInterface.progressValue() + 1);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
QFutureInterface<TestParseResultPtr> m_futureInterface;
|
||||
QVector<ITestParser *> m_parsers;
|
||||
};
|
||||
|
||||
static void performParse(QFutureInterface<TestParseResultPtr> &futureInterface,
|
||||
const QStringList &list, const QVector<ITestParser *> &parsers)
|
||||
{
|
||||
int progressValue = 0;
|
||||
futureInterface.setProgressRange(0, list.size());
|
||||
futureInterface.setProgressValue(progressValue);
|
||||
futureInterface.setProgressValue(0);
|
||||
|
||||
QtConcurrent::blockingMap(list, ParseFileForTest(futureInterface, parsers));
|
||||
if (futureInterface.isCanceled())
|
||||
parsingHasFailed = true;
|
||||
|
||||
foreach (const QString &file, list) {
|
||||
if (futureInterface.isCanceled())
|
||||
return;
|
||||
futureInterface.setProgressValue(++progressValue);
|
||||
if (!checkDocumentForTestCode(futureInterface, file, parsers)) {
|
||||
parsingHasFailed |= !CppTools::CppModelManager::instance()->snapshot().contains(file)
|
||||
&& (CppTools::ProjectFile::classify(file) != CppTools::ProjectFile::Unclassified);
|
||||
}
|
||||
}
|
||||
futureInterface.setProgressValue(list.size());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user