From c2e180db7679bbdf243d66b49f33a5a0f7f18a15 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Thu, 24 Feb 2011 09:34:19 +0100
Subject: [PATCH] QmlDump: Avoid crash when removing project during rebuild.

---
 src/plugins/qt4projectmanager/qmldumptool.cpp | 31 ++++++++++++++-----
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp
index c4b6d51e12e..85f6ac33e81 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.cpp
+++ b/src/plugins/qt4projectmanager/qmldumptool.cpp
@@ -83,9 +83,17 @@ public:
         m_buildTask->run(future);
     }
 
-    void updateProjectWhenDone(ProjectExplorer::Project *project, bool preferDebug)
+    void updateProjectWhenDone(QPointer<ProjectExplorer::Project> project, bool preferDebug)
     {
-        m_projectsToUpdate.insert(qMakePair(project, preferDebug));
+        foreach (const ProjectToUpdate &update, m_projectsToUpdate) {
+            if (update.project == project)
+                return;
+        }
+
+        ProjectToUpdate update;
+        update.project = project;
+        update.preferDebug = preferDebug;
+        m_projectsToUpdate += update;
     }
 
     bool hasFailed() const
@@ -123,12 +131,13 @@ private slots:
         if (!modelManager)
             return;
 
-        typedef QPair<ProjectExplorer::Project *, bool> ProjectAndDebug;
-        foreach (ProjectAndDebug projectAndDebug, m_projectsToUpdate) {
-            QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager->projectInfo(projectAndDebug.first);
-            projectInfo.qmlDumpPath = version->qmlDumpTool(projectAndDebug.second);
+        foreach (const ProjectToUpdate &update, m_projectsToUpdate) {
+            if (!update.project)
+                continue;
+            QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager->projectInfo(update.project);
+            projectInfo.qmlDumpPath = version->qmlDumpTool(update.preferDebug);
             if (projectInfo.qmlDumpPath.isEmpty())
-                projectInfo.qmlDumpPath = version->qmlDumpTool(!projectAndDebug.second);
+                projectInfo.qmlDumpPath = version->qmlDumpTool(!update.preferDebug);
             projectInfo.qmlDumpEnvironment = version->qmlToolsEnvironment();
             modelManager->updateProjectInfo(projectInfo);
         }
@@ -139,7 +148,13 @@ private slots:
     }
 
 private:
-    QSet<QPair<ProjectExplorer::Project *, bool> > m_projectsToUpdate;
+    class ProjectToUpdate {
+    public:
+        QPointer<ProjectExplorer::Project> project;
+        bool preferDebug;
+    };
+
+    QList<ProjectToUpdate> m_projectsToUpdate;
     Internal::DebuggingHelperBuildTask *m_buildTask; // deletes itself after run()
     QtVersion m_version;
     bool m_failed;
-- 
GitLab