summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@theqtcompany.com>2014-12-10 09:41:23 +0100
committerChristian Stenger <christian.stenger@theqtcompany.com>2014-12-18 18:32:01 +0200
commitd778fc5477ae311f7207241ef73459eafae2c83e (patch)
treec903a383c89c1e42d66a4f2ea598fc88ff46bc0e
parent19f36ebf7822533ed9c775991115ddcc260573e0 (diff)
downloadqt-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.cpp44
-rw-r--r--plugins/autotest/testcodeparser.h9
-rw-r--r--plugins/autotest/testtreeview.cpp2
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,