From 650b280b308809a2f0c748cb2ad591046dc372fd Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Fri, 26 Aug 2011 13:31:18 +0200
Subject: [PATCH] QmlJS: Ensure project infos are removed when a project
 closes.

As a side effect, this removes parse errors of QML files that are no
longer in any project from the "Build Issues" list.

Change-Id: I7aef8850a207ac060648dc92e2dd759108b71731
Reviewed-on: http://codereview.qt.nokia.com/3668
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
---
 src/libs/qmljs/qmljsmodelmanagerinterface.h  |  1 +
 src/plugins/qmljstools/qmljsmodelmanager.cpp | 19 +++++++++++++++++++
 src/plugins/qmljstools/qmljsmodelmanager.h   |  1 +
 3 files changed, 21 insertions(+)

diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h
index c021341e5d6..891350c68a7 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.h
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h
@@ -131,6 +131,7 @@ public:
     virtual QList<ProjectInfo> projectInfos() const = 0;
     virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
     virtual void updateProjectInfo(const ProjectInfo &pinfo) = 0;
+    Q_SLOT virtual void removeProjectInfo(ProjectExplorer::Project *project) = 0;
 
     virtual QStringList importPaths() const = 0;
 
diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index bc4c1cfc94d..47292d489be 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -102,6 +102,12 @@ void ModelManager::delayedInitialization()
         connect(cppModelManager, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)),
                 this, SLOT(maybeQueueCppQmlTypeUpdate(CPlusPlus::Document::Ptr)), Qt::DirectConnection);
     }
+
+    ProjectExplorer::SessionManager *sessionManager = ProjectExplorer::ProjectExplorerPlugin::instance()->session();
+    if (sessionManager) {
+        connect(sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
+                this, SLOT(removeProjectInfo(ProjectExplorer::Project*)));
+    }
 }
 
 void ModelManager::loadQmlTypeDescriptions()
@@ -303,6 +309,19 @@ void ModelManager::updateProjectInfo(const ProjectInfo &pinfo)
     emit projectInfoUpdated(pinfo);
 }
 
+
+void ModelManager::removeProjectInfo(ProjectExplorer::Project *project)
+{
+    ProjectInfo info(project);
+    // update with an empty project info to clear data
+    updateProjectInfo(info);
+
+    {
+        QMutexLocker locker(&m_mutex);
+        m_projects.remove(project);
+    }
+}
+
 void ModelManager::emitDocumentChangedOnDisk(Document::Ptr doc)
 { emit documentChangedOnDisk(doc); }
 
diff --git a/src/plugins/qmljstools/qmljsmodelmanager.h b/src/plugins/qmljstools/qmljsmodelmanager.h
index a6803a008ff..fd00825a889 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.h
+++ b/src/plugins/qmljstools/qmljsmodelmanager.h
@@ -80,6 +80,7 @@ public:
     virtual QList<ProjectInfo> projectInfos() const;
     virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
     virtual void updateProjectInfo(const ProjectInfo &pinfo);
+    Q_SLOT virtual void removeProjectInfo(ProjectExplorer::Project *project);
 
     void updateDocument(QmlJS::Document::Ptr doc);
     void updateLibraryInfo(const QString &path, const QmlJS::LibraryInfo &info);
-- 
GitLab