From f8c50013822bcf4119b88dada985c6d58fe27999 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Thu, 23 Sep 2010 14:13:03 +0200
Subject: [PATCH] Remove the QmlJSEditor dependency from Qt4ProjectManager.

The Qt4ProjectManager now uses metacalls to inform the QmlJSModelManager
about the project data.

Done-with: hjk
---
 src/libs/extensionsystem/pluginmanager.h          | 11 +++++++++++
 src/libs/qmljs/qmljsmodelmanagerinterface.cpp     |  1 +
 src/libs/qmljs/qmljsmodelmanagerinterface.h       |  6 ++++--
 src/plugins/plugins.pro                           |  1 -
 src/plugins/qmljseditor/qmljsmodelmanager.h       |  2 +-
 .../Qt4ProjectManager.pluginspec                  |  1 -
 src/plugins/qt4projectmanager/qt4project.cpp      | 15 ++++++++++++---
 .../qt4projectmanager_dependencies.pri            |  1 -
 8 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h
index d371dfe30c9..ebb2ad16fc2 100644
--- a/src/libs/extensionsystem/pluginmanager.h
+++ b/src/libs/extensionsystem/pluginmanager.h
@@ -90,6 +90,17 @@ public:
         return result;
     }
 
+    QObject *getObjectByName(const QString &name) const
+    {
+        QReadLocker lock(&m_lock);
+        QList<QObject *> all = allObjects();
+        foreach (QObject *obj, all) {
+            if (obj->objectName() == name)
+                return obj;
+        }
+        return 0;
+    }
+
     // Plugin operations
     QList<PluginSpec *> loadQueue();
     void loadPlugins();
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
index fbd340587e3..902c986da1d 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
@@ -38,6 +38,7 @@ ModelManagerInterface::ModelManagerInterface(QObject *parent)
 {
     Q_ASSERT(! g_instance);
     g_instance = this;
+    setObjectName(MODELMANAGERINTERFACE_OBJECTNAME);
 }
 
 ModelManagerInterface::~ModelManagerInterface()
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h
index 896878bceb7..f7d4742dc9c 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.h
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h
@@ -44,6 +44,8 @@ namespace ProjectExplorer {
 
 namespace QmlJS {
 
+const char *const MODELMANAGERINTERFACE_OBJECTNAME = "QmlJS::ModelManagerInterface";
+
 class Snapshot;
 
 class QMLJS_EXPORT ModelManagerInterface: public QObject
@@ -89,8 +91,8 @@ public:
     virtual void removeFiles(const QStringList &files) = 0;
 
     virtual QList<ProjectInfo> projectInfos() const = 0;
-    virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
-    virtual void updateProjectInfo(const ProjectInfo &pinfo) = 0;
+    Q_INVOKABLE virtual QmlJS::ModelManagerInterface::ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
+    Q_INVOKABLE virtual void updateProjectInfo(const QmlJS::ModelManagerInterface::ProjectInfo &pinfo) = 0;
 
     virtual QStringList importPaths() const = 0;
 
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 9702fb785d5..c126c4ebb6c 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -126,7 +126,6 @@ plugin_qt4projectmanager.depends = plugin_texteditor
 plugin_qt4projectmanager.depends += plugin_projectexplorer
 plugin_qt4projectmanager.depends += plugin_cpptools
 plugin_qt4projectmanager.depends += plugin_cppeditor
-plugin_qt4projectmanager.depends += plugin_qmljseditor
 plugin_qt4projectmanager.depends += plugin_designer
 plugin_qt4projectmanager.depends += plugin_debugger
 plugin_qt4projectmanager.depends += plugin_qmljseditor
diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.h b/src/plugins/qmljseditor/qmljsmodelmanager.h
index 1de9ef992bb..54449674ccc 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanager.h
+++ b/src/plugins/qmljseditor/qmljsmodelmanager.h
@@ -60,7 +60,7 @@ public:
     virtual void removeFiles(const QStringList &files);
 
     virtual QList<ProjectInfo> projectInfos() const;
-    virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
+    virtual QmlJS::ModelManagerInterface::ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
     virtual void updateProjectInfo(const ProjectInfo &pinfo);
 
     void emitDocumentUpdated(QmlJS::Document::Ptr doc);
diff --git a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
index 906f6c3ece3..fd8fd1f2263 100644
--- a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
+++ b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
@@ -18,7 +18,6 @@ Alternatively, this plugin may be used under the terms of the GNU Lesser General
         <dependency name="ProjectExplorer" version="2.0.90"/>
         <dependency name="CppTools" version="2.0.90"/>
         <dependency name="CppEditor" version="2.0.90"/>
-        <dependency name="QmlJSEditor" version="2.0.90"/>
         <dependency name="Designer" version="2.0.90"/>
         <dependency name="Debugger" version="2.0.90"/>
     </dependencyList>
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 907276b280e..98137567ce7 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -584,11 +584,17 @@ void Qt4Project::updateCppCodeModel()
 
 void Qt4Project::updateQmlJSCodeModel()
 {
-    QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance();
+    QObject *modelManager =
+            ExtensionSystem::PluginManager::instance()->getObjectByName(QmlJS::MODELMANAGERINTERFACE_OBJECTNAME);
     if (!modelManager)
         return;
 
-    QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager->projectInfo(this);
+    QmlJS::ModelManagerInterface::ProjectInfo projectInfo;
+    bool success = QMetaObject::invokeMethod(
+                modelManager, "projectInfo", Qt::DirectConnection,
+                Q_RETURN_ARG(QmlJS::ModelManagerInterface::ProjectInfo, projectInfo),
+                Q_ARG(ProjectExplorer::Project *, this));
+    QTC_ASSERT(success, return);
 
     // Not essential since the QmlJS engine parses required files on demand.
     //projectInfo.sourceFiles = ...
@@ -601,7 +607,10 @@ void Qt4Project::updateQmlJSCodeModel()
     }
     projectInfo.importPaths.removeDuplicates();
 
-    modelManager->updateProjectInfo(projectInfo);
+    success = QMetaObject::invokeMethod(
+                modelManager, "updateProjectInfo", Qt::DirectConnection,
+                Q_ARG(QmlJS::ModelManagerInterface::ProjectInfo, projectInfo));
+    QTC_ASSERT(success, return);
 }
 
 void Qt4Project::qtVersionsChanged()
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri b/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
index 7d2124fdded..e40eac29c4b 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
+++ b/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
@@ -1,7 +1,6 @@
 include(../../plugins/projectexplorer/projectexplorer.pri)
 include(../../plugins/cpptools/cpptools.pri)
 include(../../plugins/cppeditor/cppeditor.pri)
-include(../../plugins/qmljseditor/qmljseditor.pri)
 include(../../plugins/designer/designer.pri)
 include(../../plugins/debugger/debugger.pri)
 include(../../libs/symbianutils/symbianutils.pri)
-- 
GitLab