From 427f7754894fab55bb388bca78583dec3350ed42 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Tue, 21 Sep 2010 14:28:55 +0200
Subject: [PATCH] QmlJS: Allow setting import paths in Qt4Projects using
 QML_IMPORT_PATH.

Introduced new Creator-specific qmake variable QML_IMPORT_PATH that
lists the import paths required by the QmlJS engine.

Done-with: Alessandro Portale
---
 .../Qt4ProjectManager.pluginspec              |  1 +
 src/plugins/qt4projectmanager/qt4nodes.cpp    |  2 ++
 src/plugins/qt4projectmanager/qt4nodes.h      |  3 +-
 src/plugins/qt4projectmanager/qt4project.cpp  | 35 +++++++++++++++++--
 src/plugins/qt4projectmanager/qt4project.h    |  4 ++-
 .../qt4projectmanager_dependencies.pri        |  1 +
 6 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
index fd8fd1f2263..906f6c3ece3 100644
--- a/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
+++ b/src/plugins/qt4projectmanager/Qt4ProjectManager.pluginspec
@@ -18,6 +18,7 @@ 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/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 25199985fb5..888c45f2652 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -1591,6 +1591,8 @@ void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async)
                                               0);
     newVarValues[LibDirectoriesVar] = libDirectories(m_readerExact);
     newVarValues[ConfigVar] = m_readerExact->values(QLatin1String("CONFIG"));
+    newVarValues[QmlImportPathVar] = m_readerExact->absolutePathValues(
+                QLatin1String("QML_IMPORT_PATH"), m_projectDir);
 
     if (m_varValues != newVarValues) {
         m_varValues = newVarValues;
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index 371de843b6c..f9bdfd29c50 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -94,7 +94,8 @@ enum Qt4Variable {
     PkgConfigVar,
     PrecompiledHeaderVar,
     LibDirectoriesVar,
-    ConfigVar
+    ConfigVar,
+    QmlImportPathVar
 };
 
 class Qt4PriFileNode;
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 69df3c5ebb7..907276b280e 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -47,6 +47,7 @@
 #include <coreplugin/progressmanager/progressmanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <cpptools/cppmodelmanagerinterface.h>
+#include <qmljs/qmljsmodelmanagerinterface.h>
 #include <projectexplorer/buildenvironmentwidget.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
 #include <utils/qtcassert.h>
@@ -318,7 +319,7 @@ bool Qt4Project::fromMap(const QVariantMap &map)
     update();
     updateFileList();
     // This might be incorrect, need a full update
-    updateCodeModel();
+    updateCodeModels();
 
     createApplicationProjects();
 
@@ -395,7 +396,7 @@ bool Qt4Project::equalFileList(const QStringList &a, const QStringList &b)
     return (ait == aend && bit == bend);
 }
 
-void Qt4Project::updateCodeModel()
+void Qt4Project::updateCodeModels()
 {
     if (debug)
         qDebug()<<"Qt4Project::updateCodeModel()";
@@ -403,6 +404,12 @@ void Qt4Project::updateCodeModel()
     if (!activeTarget() || !activeTarget()->activeBuildConfiguration())
         return;
 
+    updateCppCodeModel();
+    updateQmlJSCodeModel();
+}
+
+void Qt4Project::updateCppCodeModel()
+{
     Qt4BuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration();
 
     CppTools::CppModelManagerInterface *modelmanager =
@@ -575,6 +582,28 @@ void Qt4Project::updateCodeModel()
     }
 }
 
+void Qt4Project::updateQmlJSCodeModel()
+{
+    QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance();
+    if (!modelManager)
+        return;
+
+    QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager->projectInfo(this);
+
+    // Not essential since the QmlJS engine parses required files on demand.
+    //projectInfo.sourceFiles = ...
+
+    FindQt4ProFiles findQt4ProFiles;
+    QList<Qt4ProFileNode *> proFiles = findQt4ProFiles(rootProjectNode());
+
+    foreach (Qt4ProFileNode *node, proFiles) {
+        projectInfo.importPaths.append(node->variableValue(QmlImportPathVar));
+    }
+    projectInfo.importPaths.removeDuplicates();
+
+    modelManager->updateProjectInfo(projectInfo);
+}
+
 void Qt4Project::qtVersionsChanged()
 {
     setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds());
@@ -751,7 +780,7 @@ void Qt4Project::decrementPendingEvaluateFutures()
         } else  if (m_asyncUpdateState != ShuttingDown){
             // After beeing done, we need to call:
             updateFileList();
-            updateCodeModel();
+            updateCodeModels();
             if (debug)
                 qDebug()<<"  Setting state to Base";
             m_asyncUpdateState = Base;
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 25e550a7fe9..c39215911c0 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -217,7 +217,9 @@ private:
     void scheduleAsyncUpdate();
 
     void createApplicationProjects();
-    void updateCodeModel();
+    void updateCodeModels();
+    void updateCppCodeModel();
+    void updateQmlJSCodeModel();
     void updateFileList();
 
     static void collectLeafProFiles(QList<Internal::Qt4ProFileNode *> &list, Internal::Qt4ProFileNode *node);
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri b/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
index e40eac29c4b..7d2124fdded 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
+++ b/src/plugins/qt4projectmanager/qt4projectmanager_dependencies.pri
@@ -1,6 +1,7 @@
 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