diff options
author | Christian Stenger <christian.stenger@theqtcompany.com> | 2015-01-28 13:01:07 +0100 |
---|---|---|
committer | Christian Stenger <christian.stenger@theqtcompany.com> | 2015-01-28 15:29:23 +0200 |
commit | 3629aa904448d7f62aab00629156093ca0cd5c60 (patch) | |
tree | 6b42f05af2a437974f643f67d923ec09aa9c1023 /plugins | |
parent | 2aa7ce735069f23462852567a375c3515a185872 (diff) | |
download | qt-creator-3629aa904448d7f62aab00629156093ca0cd5c60.tar.gz |
Fetch current project always before accessing
This fixes two different crashes when TestCodeParser tried
to access m_currentProject, but the object this pointer was
referencing had been deleted already.
Change-Id: Ie59e027394e613a8ef1e4f32f97abed6e8cb007a
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/autotest/testcodeparser.cpp | 52 | ||||
-rw-r--r-- | plugins/autotest/testcodeparser.h | 5 |
2 files changed, 24 insertions, 33 deletions
diff --git a/plugins/autotest/testcodeparser.cpp b/plugins/autotest/testcodeparser.cpp index 46cc75ad4b..6faa7d160d 100644 --- a/plugins/autotest/testcodeparser.cpp +++ b/plugins/autotest/testcodeparser.cpp @@ -49,7 +49,6 @@ namespace Internal { TestCodeParser::TestCodeParser(TestTreeModel *parent) : QObject(parent), m_model(parent), - m_currentProject(0), m_parserEnabled(true), m_pendingUpdate(false) { @@ -70,6 +69,14 @@ void TestCodeParser::emitUpdateTestTree() QTimer::singleShot(1000, this, SLOT(updateTestTree())); } +ProjectExplorer::Project *currentProject() +{ + const ProjectExplorer::SessionManager *session = ProjectExplorer::SessionManager::instance(); + if (!session || !session->hasProjects()) + return 0; + return session->startupProject(); +} + void TestCodeParser::updateTestTree() { if (!m_parserEnabled) { @@ -83,29 +90,15 @@ void TestCodeParser::updateTestTree() clearMaps(); m_model->removeAllAutoTests(); m_model->removeAllQuickTests(); - const ProjectExplorer::SessionManager *session = ProjectExplorer::SessionManager::instance(); - if (!session || !session->hasProjects()) { - if (m_currentProject) { - if (QmakeProjectManager::QmakeProject *qmproj - = qobject_cast<QmakeProjectManager::QmakeProject *>(m_currentProject)) { - disconnect(qmproj, &QmakeProjectManager::QmakeProject::proFilesEvaluated, - this, &TestCodeParser::onProFileEvaluated); - } + + if (ProjectExplorer::Project *proj = currentProject()) { + if (auto qmakeProject = qobject_cast<QmakeProjectManager::QmakeProject *>(proj)) { + connect(qmakeProject, &QmakeProjectManager::QmakeProject::proFilesEvaluated, + this, &TestCodeParser::onProFileEvaluated, Qt::UniqueConnection); } - m_currentProject = 0; + } else return; - } - m_currentProject = session->startupProject(); - if (!m_currentProject) - return; - else { - if (QmakeProjectManager::QmakeProject *qmproj - = qobject_cast<QmakeProjectManager::QmakeProject *>(m_currentProject)) { - connect(qmproj, &QmakeProjectManager::QmakeProject::proFilesEvaluated, - this, &TestCodeParser::onProFileEvaluated); - } - } scanForTests(); m_pendingUpdate = false; } @@ -568,7 +561,8 @@ void TestCodeParser::handleQtQuickTest(CPlusPlus::Document::Ptr doc) void TestCodeParser::onCppDocumentUpdated(const CPlusPlus::Document::Ptr &doc) { - if (!m_currentProject) + ProjectExplorer::Project *project = currentProject(); + if (!project) return; const QString fileName = doc->fileName(); if (m_cppDocMap.contains(fileName)) { @@ -577,7 +571,7 @@ void TestCodeParser::onCppDocumentUpdated(const CPlusPlus::Document::Ptr &doc) qDebug("Skipped due revision equality"); // added to verify if this ever happens.. return; } - } else if (!m_currentProject->files(ProjectExplorer::Project::AllFiles).contains(fileName)) { + } else if (!project->files(ProjectExplorer::Project::AllFiles).contains(fileName)) { return; } checkDocumentForTestCode(doc); @@ -585,7 +579,8 @@ void TestCodeParser::onCppDocumentUpdated(const CPlusPlus::Document::Ptr &doc) void TestCodeParser::onQmlDocumentUpdated(const QmlJS::Document::Ptr &doc) { - if (!m_currentProject) + ProjectExplorer::Project *project = currentProject(); + if (!project) return; const QString fileName = doc->fileName(); if (m_quickDocMap.contains(fileName)) { @@ -593,7 +588,7 @@ void TestCodeParser::onQmlDocumentUpdated(const QmlJS::Document::Ptr &doc) qDebug("Skipped due revision equality (QML)"); // added to verify this ever happens.... return; } - } else if (!m_currentProject->files(ProjectExplorer::Project::AllFiles).contains(fileName)) { + } else if (!project->files(ProjectExplorer::Project::AllFiles).contains(fileName)) { // what if the file is not listed inside the pro file, but will be used anyway? return; } @@ -627,7 +622,7 @@ void TestCodeParser::scanForTests(const QStringList &fileList) { QStringList list; if (fileList.isEmpty()) { - list = m_currentProject->files(ProjectExplorer::Project::AllFiles); + list = currentProject()->files(ProjectExplorer::Project::AllFiles); } else { list << fileList; } @@ -767,11 +762,12 @@ void TestCodeParser::onAllTasksFinished(Core::Id type) void TestCodeParser::onProFileEvaluated() { - if (!m_currentProject) + ProjectExplorer::Project *project = currentProject(); + if (!project) return; CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); - const QList<CppTools::ProjectPart::Ptr> pp = cppMM->projectInfo(m_currentProject).projectParts(); + const QList<CppTools::ProjectPart::Ptr> pp = cppMM->projectInfo(project).projectParts(); foreach (const CppTools::ProjectPart::Ptr &p, pp) { if (!p->selectedForBuilding) removeTestsIfNecessaryByProFile(p->projectFile); diff --git a/plugins/autotest/testcodeparser.h b/plugins/autotest/testcodeparser.h index 02556243f6..8a78026857 100644 --- a/plugins/autotest/testcodeparser.h +++ b/plugins/autotest/testcodeparser.h @@ -26,10 +26,6 @@ #include <QObject> #include <QMap> -namespace ProjectExplorer { -class Project; -} - namespace Core { class Id; } @@ -71,7 +67,6 @@ private: TestTreeModel *m_model; QMap<QString, TestInfo> m_cppDocMap; QMap<QString, TestInfo> m_quickDocMap; - ProjectExplorer::Project *m_currentProject; bool m_parserEnabled; bool m_pendingUpdate; }; |