diff options
author | Christian Stenger <christian.stenger@theqtcompany.com> | 2014-12-10 09:41:23 +0100 |
---|---|---|
committer | Christian Stenger <christian.stenger@theqtcompany.com> | 2014-12-18 18:32:01 +0200 |
commit | d778fc5477ae311f7207241ef73459eafae2c83e (patch) | |
tree | c903a383c89c1e42d66a4f2ea598fc88ff46bc0e | |
parent | 19f36ebf7822533ed9c775991115ddcc260573e0 (diff) | |
download | qt-creator-d778fc5477ae311f7207241ef73459eafae2c83e.tar.gz |
Post-pone parsing for test if CppModelManager is parsing
Change-Id: I7af93eb587e55f7d6e4ee14ed9808ceeb41ed8a3
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
-rw-r--r-- | plugins/autotest/testcodeparser.cpp | 44 | ||||
-rw-r--r-- | plugins/autotest/testcodeparser.h | 9 | ||||
-rw-r--r-- | plugins/autotest/testtreeview.cpp | 2 |
3 files changed, 53 insertions, 2 deletions
diff --git a/plugins/autotest/testcodeparser.cpp b/plugins/autotest/testcodeparser.cpp index a0ba1534ce..e2d342cb48 100644 --- a/plugins/autotest/testcodeparser.cpp +++ b/plugins/autotest/testcodeparser.cpp @@ -23,15 +23,20 @@ #include "testtreemodel.h" #include "testvisitor.h" +#include <coreplugin/progressmanager/progressmanager.h> + #include <cplusplus/LookupContext.h> #include <cplusplus/TypeOfExpression.h> +#include <cpptools/cpptoolsconstants.h> #include <cpptools/cppmodelmanager.h> #include <cpptools/cppworkingcopy.h> #include <projectexplorer/session.h> #include <qmakeprojectmanager/qmakeproject.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> + #include <qmljs/parser/qmljsast_p.h> #include <qmljs/qmljsdialect.h> #include <qmljstools/qmljsmodelmanager.h> @@ -44,8 +49,15 @@ namespace Internal { TestCodeParser::TestCodeParser(TestTreeModel *parent) : QObject(parent), m_model(parent), - m_currentProject(0) + m_currentProject(0), + m_parserEnabled(true), + m_pendingUpdate(false) { + // connect to ProgressManager to post-pone test parsing when CppModelManager is parsing + Core::ProgressManager *pm = qobject_cast<Core::ProgressManager *>( + Core::ProgressManager::instance()); + connect(pm, &Core::ProgressManager::taskStarted, this, &TestCodeParser::onTaskStarted); + connect(pm, &Core::ProgressManager::allTasksFinished, this, &TestCodeParser::onAllTasksFinished); } TestCodeParser::~TestCodeParser() @@ -53,8 +65,19 @@ TestCodeParser::~TestCodeParser() clearMaps(); } +void TestCodeParser::emitUpdateTestTree() +{ + QTimer::singleShot(1000, this, SLOT(updateTestTree())); +} + void TestCodeParser::updateTestTree() { + if (!m_parserEnabled) { + m_pendingUpdate = true; + qDebug() << "Skipped update due to running parser or pro file evaluate"; + return; + } + qDebug("updating TestTreeModel"); clearMaps(); @@ -84,6 +107,7 @@ void TestCodeParser::updateTestTree() } } scanForTests(); + m_pendingUpdate = false; } /****** scan for QTest related stuff helpers ******/ @@ -721,6 +745,24 @@ void TestCodeParser::removeTestsIfNecessaryByProFile(const QString &proFile) m_quickDocMap.insert(tr(Constants::UNNAMED_QUICKTESTS), unnamedInfo); } +void TestCodeParser::onTaskStarted(Core::Id type) +{ + if (type != CppTools::Constants::TASK_INDEX + && type != QmakeProjectManager::Constants::PROFILE_EVALUATE) + return; + m_parserEnabled = false; +} + +void TestCodeParser::onAllTasksFinished(Core::Id type) +{ + if (type != CppTools::Constants::TASK_INDEX + && type != QmakeProjectManager::Constants::PROFILE_EVALUATE) + return; + m_parserEnabled = true; + if (m_pendingUpdate) + updateTestTree(); +} + void TestCodeParser::onProFileEvaluated() { if (!m_currentProject) diff --git a/plugins/autotest/testcodeparser.h b/plugins/autotest/testcodeparser.h index da89eb51d7..02556243f6 100644 --- a/plugins/autotest/testcodeparser.h +++ b/plugins/autotest/testcodeparser.h @@ -30,6 +30,10 @@ namespace ProjectExplorer { class Project; } +namespace Core { +class Id; +} + namespace Autotest { namespace Internal { @@ -46,6 +50,7 @@ public: signals: public slots: + void emitUpdateTestTree(); void updateTestTree(); void checkDocumentForTestCode(CPlusPlus::Document::Ptr doc); void handleQtQuickTest(CPlusPlus::Document::Ptr doc); @@ -60,11 +65,15 @@ private: void clearMaps(); void removeTestsIfNecessary(const QString &fileName); void removeTestsIfNecessaryByProFile(const QString &proFile); + void onTaskStarted(Core::Id type); + void onAllTasksFinished(Core::Id type); TestTreeModel *m_model; QMap<QString, TestInfo> m_cppDocMap; QMap<QString, TestInfo> m_quickDocMap; ProjectExplorer::Project *m_currentProject; + bool m_parserEnabled; + bool m_pendingUpdate; }; } // namespace Internal diff --git a/plugins/autotest/testtreeview.cpp b/plugins/autotest/testtreeview.cpp index 22632acafe..9aa7422a94 100644 --- a/plugins/autotest/testtreeview.cpp +++ b/plugins/autotest/testtreeview.cpp @@ -65,7 +65,7 @@ TestTreeViewWidget::TestTreeViewWidget(QWidget *parent) : TestCodeParser *parser = m_model->parser(); ProjectExplorer::SessionManager *sm = ProjectExplorer::SessionManager::instance(); connect(sm, &ProjectExplorer::SessionManager::startupProjectChanged, - parser, &TestCodeParser::updateTestTree); + parser, &TestCodeParser::emitUpdateTestTree); CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); connect(cppMM, &CppTools::CppModelManager::documentUpdated, |