From 0969f3b85f0bad67f304389027261dcf9bad27f1 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 25 Jan 2010 17:13:04 +0100
Subject: [PATCH] Resolve the `import' directives.

Yet another quick and dirty hack while waiting for the real binding pass.
---
 src/plugins/qmljseditor/qmlcodecompletion.cpp | 50 ++++++++++++++++---
 src/plugins/qmljseditor/qmlcodecompletion.h   |  2 +
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp
index 9b3763ae092..199f5f69fa9 100644
--- a/src/plugins/qmljseditor/qmlcodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp
@@ -44,6 +44,7 @@
 
 #include <QtCore/QFile>
 #include <QtCore/QFileInfo>
+#include <QtCore/QDir>
 #include <QtCore/QXmlStreamReader>
 #include <QtCore/QDebug>
 
@@ -130,8 +131,18 @@ static Interpreter::ObjectValue *newComponent(Interpreter::Engine *engine, const
                             for (AST::UiObjectMemberList *it = def->initializer->members; it; it = it->next) {
                                 if (AST::UiPublicMember *prop = AST::cast<AST::UiPublicMember *>(it->member)) {
                                     if (prop->name && prop->memberType) {
-                                        //qDebug() << "add property:" << prop->name->asString();
-                                        object->setProperty(prop->name->asString(), engine->undefinedValue());
+                                        const QString propName = prop->name->asString();
+                                        const QString propType = prop->memberType->asString();
+
+                                        // ### generalize
+                                        if (propType == QLatin1String("string") || propType == QLatin1String("url"))
+                                            object->setProperty(propName, engine->stringValue());
+                                        else if (propType == QLatin1String("bool"))
+                                            object->setProperty(propName, engine->booleanValue());
+                                        else if (propType == QLatin1String("int") || propType == QLatin1String("real"))
+                                            object->setProperty(propName, engine->numberValue());
+                                        else
+                                            object->setProperty(propName, engine->undefinedValue());
                                     }
                                 }
                             }
@@ -684,6 +695,29 @@ bool QmlCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
     return false;
 }
 
+bool QmlCodeCompletion::isImported(Document::Ptr doc, const QString &currentFilePath) const
+{
+    if (! (doc && doc->qmlProgram()))
+        return false;
+
+    QFileInfo fileInfo(doc->fileName());
+    const QString absolutePath = fileInfo.absolutePath();
+
+    for (AST::UiImportList *it = doc->qmlProgram()->imports; it; it = it->next) {
+        if (! (it->import && it->import->fileName))
+            continue;
+
+        QString path = absolutePath;
+        path += QLatin1Char('/');
+        path += it->import->fileName->asString();
+        path = QDir::cleanPath(path);
+        if (path == currentFilePath)
+            return true;
+    }
+
+    return false;
+}
+
 int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 {
     m_editor = editor;
@@ -718,14 +752,16 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
     foreach (Document::Ptr doc, snapshot) {
         const QFileInfo fileInfo(doc->fileName());
+        const QString absolutePath = fileInfo.absolutePath();
 
+        // ### generalize
         if (fileInfo.suffix() != QLatin1String("qml"))
             continue;
-        else if (fileInfo.absolutePath() != currentFilePath) // ### FIXME include `imported' components
+        else if (absolutePath != currentFilePath && ! isImported(qmlDocument, absolutePath))
             continue;
 
         const QString typeName = fileInfo.baseName();
-        if (typeName.isEmpty())
+        if (typeName.isEmpty() || ! typeName.at(0).isUpper())
             continue;
 
         userComponents.insert(typeName, doc);
@@ -733,10 +769,12 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
     foreach (Document::Ptr doc, snapshot) {
         const QFileInfo fileInfo(doc->fileName());
+        const QString absolutePath = fileInfo.absolutePath();
 
+         // ### generalize
         if (fileInfo.suffix() != QLatin1String("qml"))
             continue;
-        else if (fileInfo.absolutePath() != currentFilePath) // ### FIXME include `imported' components
+        else if (absolutePath != currentFilePath && ! isImported(qmlDocument, absolutePath))
             continue;
 
         QMapIterator<QString, IdSymbol *> it(doc->ids());
@@ -784,7 +822,7 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
         const QString propType = prop->memberType->asString();
 
         // ### TODO: generalize
-        if (propType == QLatin1String("string"))
+        if (propType == QLatin1String("string") || propType == QLatin1String("url"))
             interp.globalObject()->setProperty(propName, interp.stringValue());
         else if (propType == QLatin1String("bool"))
             interp.globalObject()->setProperty(propName, interp.booleanValue());
diff --git a/src/plugins/qmljseditor/qmlcodecompletion.h b/src/plugins/qmljseditor/qmlcodecompletion.h
index 990e11b48bd..efa00f89477 100644
--- a/src/plugins/qmljseditor/qmlcodecompletion.h
+++ b/src/plugins/qmljseditor/qmlcodecompletion.h
@@ -31,6 +31,7 @@
 #define QMLCODECOMPLETION_H
 
 #include <qmljs/qmljstypesystem.h>
+#include <qmljs/qmljsdocument.h>
 #include <texteditor/icompletioncollector.h>
 #include <QtCore/QDateTime>
 #include <QtCore/QPointer>
@@ -70,6 +71,7 @@ public:
 
 private:
     void updateSnippets();
+    bool isImported(QmlJS::Document::Ptr doc, const QString &currentFilePath) const;
 
     QmlModelManagerInterface *m_modelManager;
     TextEditor::ITextEditable *m_editor;
-- 
GitLab