From 0b527de52e2e5b58169efd1221a4610260c82b75 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 12 Jul 2016 09:45:55 +0200 Subject: [PATCH] AutoTest: Fix parsing for QuickTests If the scan for quick tests was triggered just by a change of a qml file (including indexing by the respective modelmanager) we might find tests that won't be able to execute. If we have already found quick tests we know their respective project files. If we cannot find the files to be scanned inside the already found ignore scan requests for such files. This patch is kind of a continuation of b570ee1b801da0906fdba9e0218e681b003a9857 (Fix initial parsing when loading session) Change-Id: Ic1228641f60abf127134acbd4232a0ddd30ef159 Reviewed-by: Nikolai Kosjar Reviewed-by: Christian Stenger --- src/plugins/autotest/quick/quicktest_utils.h | 34 +++++++++++++++++++ .../autotest/quick/quicktestparser.cpp | 6 +++- src/plugins/autotest/quick/quicktestparser.h | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/plugins/autotest/quick/quicktest_utils.h b/src/plugins/autotest/quick/quicktest_utils.h index 950328abaf7..f7a17ad538c 100644 --- a/src/plugins/autotest/quick/quicktest_utils.h +++ b/src/plugins/autotest/quick/quicktest_utils.h @@ -25,6 +25,10 @@ #pragma once +#include "../testframeworkmanager.h" + +#include + #include namespace Autotest { @@ -38,6 +42,36 @@ public: static const QByteArrayList valid = {"QUICK_TEST_MAIN", "QUICK_TEST_OPENGL_MAIN"}; return valid.contains(macro); } + + static QHash proFilesForQmlFiles(const Core::Id &id, const QStringList &files) + { + QHash result; + TestTreeItem *rootNode = TestFrameworkManager::instance()->rootNodeForTestFramework(id); + QTC_ASSERT(rootNode, return result); + + if (files.isEmpty()) + return result; + + for (int row = 0, rootCount = rootNode->childCount(); row < rootCount; ++row) { + const TestTreeItem *child = rootNode->childItem(row); + const QString &file = child->filePath(); + if (!file.isEmpty() && files.contains(file)) { + const QString &proFile = child->proFile(); + if (!proFile.isEmpty()) + result.insert(file, proFile); + } + for (int subRow = 0, subCount = child->childCount(); subRow < subCount; ++subRow) { + const TestTreeItem *grandChild = child->childItem(subRow); + const QString &file = grandChild->filePath(); + if (!file.isEmpty() && files.contains(file)) { + const QString &proFile = grandChild->proFile(); + if (!proFile.isEmpty()) + result.insert(file, proFile); + } + } + } + return result; + } }; } // namespace Internal diff --git a/src/plugins/autotest/quick/quicktestparser.cpp b/src/plugins/autotest/quick/quicktestparser.cpp index 49ad52c6712..c31e54a34e4 100644 --- a/src/plugins/autotest/quick/quicktestparser.cpp +++ b/src/plugins/autotest/quick/quicktestparser.cpp @@ -220,6 +220,7 @@ static bool handleQtQuickTest(QFutureInterface futureInterfa void QuickTestParser::init(const QStringList &filesToParse) { m_qmlSnapshot = QmlJSTools::Internal::ModelManager::instance()->snapshot(); + m_proFilesForQmlFiles = QuickTestUtils::proFilesForQmlFiles(id(), filesToParse); CppParser::init(filesToParse); } @@ -227,8 +228,11 @@ bool QuickTestParser::processDocument(QFutureInterface futur const QString &fileName) { if (fileName.endsWith(".qml")) { + const QString &proFile = m_proFilesForQmlFiles.value(fileName); + if (proFile.isEmpty()) + return false; QmlJS::Document::Ptr qmlJSDoc = m_qmlSnapshot.document(fileName); - return checkQmlDocumentForQuickTestCode(futureInterface, qmlJSDoc, id()); + return checkQmlDocumentForQuickTestCode(futureInterface, qmlJSDoc, id(), proFile); } if (!m_cppSnapshot.contains(fileName) || !selectedForBuilding(fileName)) return false; diff --git a/src/plugins/autotest/quick/quicktestparser.h b/src/plugins/autotest/quick/quicktestparser.h index 76ace6e435e..8f1c5ed6a0c 100644 --- a/src/plugins/autotest/quick/quicktestparser.h +++ b/src/plugins/autotest/quick/quicktestparser.h @@ -47,6 +47,7 @@ public: const QString &fileName) override; private: QmlJS::Snapshot m_qmlSnapshot; + QHash m_proFilesForQmlFiles; }; } // namespace Internal