diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 0c3da8a969e..c2afe3846de 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -108,7 +108,7 @@ void TestCodeParser::setState(State state) } } -void TestCodeParser::syncTestFrameworks(const QList &frameworks) +void TestCodeParser::syncTestFrameworks(const QList &parsers) { if (m_parserState != Idle) { // there's a running parse @@ -116,13 +116,8 @@ void TestCodeParser::syncTestFrameworks(const QList &framework m_postponedFiles.clear(); Core::ProgressManager::cancelTasks(Constants::TASK_PARSE); } - m_testCodeParsers.clear(); - qCDebug(LOG) << "Setting" << frameworks << "as current parsers"; - for (ITestFramework *framework : frameworks) { - ITestParser *testParser = framework->testParser(); - QTC_ASSERT(testParser, continue); // buildsystem based frameworks have no code parser - m_testCodeParsers.append(testParser); - } + qCDebug(LOG) << "Setting" << parsers << "as current parsers"; + m_testCodeParsers = parsers; } void TestCodeParser::emitUpdateTestTree(ITestParser *parser) @@ -130,7 +125,7 @@ void TestCodeParser::emitUpdateTestTree(ITestParser *parser) if (m_testCodeParsers.isEmpty()) return; if (parser) - m_updateParsers.insert(parser->framework()); + m_updateParsers.insert(parser); else m_updateParsers.clear(); if (m_singleShotScheduled) { @@ -143,18 +138,18 @@ void TestCodeParser::emitUpdateTestTree(ITestParser *parser) QTimer::singleShot(1000, this, [this]() { updateTestTree(m_updateParsers); }); } -void TestCodeParser::updateTestTree(const QSet &frameworks) +void TestCodeParser::updateTestTree(const QSet &parsers) { m_singleShotScheduled = false; if (m_codeModelParsing) { m_fullUpdatePostponed = true; m_partialUpdatePostponed = false; m_postponedFiles.clear(); - if (frameworks.isEmpty()) { + if (parsers.isEmpty()) { m_updateParsers.clear(); } else { - for (ITestFramework *framework : frameworks) - m_updateParsers.insert(framework); + for (ITestParser *parser : parsers) + m_updateParsers.insert(parser); } return; } @@ -164,9 +159,11 @@ void TestCodeParser::updateTestTree(const QSet &frameworks) m_fullUpdatePostponed = false; qCDebug(LOG) << "calling scanForTests (updateTestTree)"; - TestFrameworks sortedFrameworks = Utils::toList(frameworks); - Utils::sort(sortedFrameworks, &ITestFramework::priority); - scanForTests(QStringList(), sortedFrameworks); + QList sortedParsers = Utils::toList(parsers); + Utils::sort(sortedParsers, [](const ITestParser *lhs, const ITestParser *rhs) { + return lhs->framework()->priority() < rhs->framework()->priority(); + }); + scanForTests(QStringList(), sortedParsers); } /****** threaded parsing stuff *******/ @@ -296,7 +293,7 @@ static void parseFileForTests(const QList &parsers, } } -void TestCodeParser::scanForTests(const QStringList &fileList, const QList &parsers) +void TestCodeParser::scanForTests(const QStringList &fileList, const QList &parsers) { if (m_parserState == Shutdown || m_testCodeParsers.isEmpty()) return; @@ -337,18 +334,16 @@ void TestCodeParser::scanForTests(const QStringList &fileList, const QListtestParser(), continue); // mark only frameworks with a parser - framework->rootNode()->markForRemovalRecursively(true); + for (ITestParser *parser : parsers) { + parser->framework()->rootNode()->markForRemovalRecursively(true); } } else { emit requestRemoveAllFrameworkItems(); } } else if (!parsers.isEmpty()) { - for (ITestFramework *framework : parsers) { + for (ITestParser *parser: parsers) { for (const QString &filePath : qAsConst(list)) { - QTC_ASSERT(framework->testParser(), continue); - framework->rootNode()->markForRemovalRecursively(filePath); + parser->framework()->rootNode()->markForRemovalRecursively(filePath); } } } else { @@ -359,9 +354,7 @@ void TestCodeParser::scanForTests(const QStringList &fileList, const QList codeParsers - = parsers.isEmpty() ? m_testCodeParsers - : Utils::transform(parsers, &ITestFramework::testParser); + const QList codeParsers = parsers.isEmpty() ? m_testCodeParsers : parsers; qCDebug(LOG) << QDateTime::currentDateTime().toString("hh:mm:ss.zzz") << "StartParsing"; for (ITestParser *parser : codeParsers) parser->init(list, isFullParse); diff --git a/src/plugins/autotest/testcodeparser.h b/src/plugins/autotest/testcodeparser.h index 83c06b0eeed..c426c274da7 100644 --- a/src/plugins/autotest/testcodeparser.h +++ b/src/plugins/autotest/testcodeparser.h @@ -43,8 +43,6 @@ namespace ProjectExplorer { class Project; } namespace Autotest { -class ITestFramework; - namespace Internal { class TestCodeParser : public QObject @@ -64,7 +62,7 @@ public: State state() const { return m_parserState; } bool isParsing() const { return m_parserState == PartialParse || m_parserState == FullParse; } void setDirty() { m_dirty = true; } - void syncTestFrameworks(const QList &frameworks); + void syncTestFrameworks(const QList &parsers); #ifdef WITH_TESTS bool furtherParsingExpected() const { return m_singleShotScheduled || m_fullUpdatePostponed || m_partialUpdatePostponed; } @@ -81,7 +79,7 @@ signals: public: void emitUpdateTestTree(ITestParser *parser = nullptr); - void updateTestTree(const QSet &frameworks = {}); + void updateTestTree(const QSet &parsers = {}); void onCppDocumentUpdated(const CPlusPlus::Document::Ptr &document); void onQmlDocumentUpdated(const QmlJS::Document::Ptr &document); void onStartupProjectChanged(ProjectExplorer::Project *project); @@ -91,7 +89,7 @@ public: private: bool postponed(const QStringList &fileList); void scanForTests(const QStringList &fileList = QStringList(), - const QList &parserIds = {}); + const QList &parsers = {}); // qml files must be handled slightly different void onDocumentUpdated(const QString &fileName, bool isQmlFile = false); @@ -117,7 +115,7 @@ private: QFutureWatcher m_futureWatcher; QList m_testCodeParsers; // ptrs are still owned by TestFrameworkManager QTimer m_reparseTimer; - QSet m_updateParsers; + QSet m_updateParsers; QThreadPool *m_threadPool = nullptr; }; diff --git a/src/plugins/autotest/testtreemodel.cpp b/src/plugins/autotest/testtreemodel.cpp index a6135bfbaeb..2ac9e369ec7 100644 --- a/src/plugins/autotest/testtreemodel.cpp +++ b/src/plugins/autotest/testtreemodel.cpp @@ -321,9 +321,10 @@ void TestTreeModel::synchronizeTestFrameworks() }); } + const auto sortedParsers = Utils::transform(sorted, &ITestFramework::testParser); // pre-check to avoid further processing when frameworks are unchanged Utils::TreeItem *invisibleRoot = rootItem(); - QSet newlyAdded; + QSet newlyAdded; QList oldFrameworkRoots; for (Utils::TreeItem *oldFrameworkRoot : *invisibleRoot) oldFrameworkRoots.append(static_cast(oldFrameworkRoot)); @@ -331,11 +332,11 @@ void TestTreeModel::synchronizeTestFrameworks() for (ITestTreeItem *oldFrameworkRoot : oldFrameworkRoots) takeItem(oldFrameworkRoot); // do NOT delete the ptr is still held by TestFrameworkManager - for (ITestFramework *framework : qAsConst(sorted)) { - TestTreeItem *frameworkRootNode = framework->rootNode(); + for (ITestParser *parser : sortedParsers) { + TestTreeItem *frameworkRootNode = parser->framework()->rootNode(); invisibleRoot->appendChild(frameworkRootNode); if (!oldFrameworkRoots.removeOne(frameworkRootNode)) - newlyAdded.insert(framework); + newlyAdded.insert(parser); } for (ITestTreeItem *oldFrameworkRoot : oldFrameworkRoots) { if (oldFrameworkRoot->testBase()->type() == ITestBase::Framework) @@ -344,7 +345,7 @@ void TestTreeModel::synchronizeTestFrameworks() invisibleRoot->appendChild(oldFrameworkRoot); } - m_parser->syncTestFrameworks(sorted); + m_parser->syncTestFrameworks(sortedParsers); if (!newlyAdded.isEmpty()) m_parser->updateTestTree(newlyAdded); emit updatedActiveFrameworks(invisibleRoot->childCount());