From 95849cb0bda2a5d91392c0d34fc10acd8f571b2c Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 2 Feb 2010 17:06:48 +0100
Subject: [PATCH] Store bindings and definitions in one single table.

---
 src/libs/qmljs/qmljsbind.cpp |  4 +--
 src/libs/qmljs/qmljsbind.h   |  3 +-
 src/libs/qmljs/qmljslink.cpp | 55 ++++++++++++++----------------------
 src/libs/qmljs/qmljslink.h   |  3 +-
 4 files changed, 26 insertions(+), 39 deletions(-)

diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp
index 37617c297c7..a7da7492439 100644
--- a/src/libs/qmljs/qmljsbind.cpp
+++ b/src/libs/qmljs/qmljsbind.cpp
@@ -270,7 +270,7 @@ bool Bind::visit(UiPublicMember *)
 bool Bind::visit(UiObjectDefinition *ast)
 {
     ObjectValue *value = bindObject(ast->qualifiedTypeNameId, ast->initializer);
-    _qmlObjectDefinitions.insert(ast, value);
+    _qmlObjects.insert(ast, value);
 
     return false;
 }
@@ -279,7 +279,7 @@ bool Bind::visit(UiObjectBinding *ast)
 {
 //    const QString name = serialize(ast->qualifiedId);
     ObjectValue *value = bindObject(ast->qualifiedTypeNameId, ast->initializer);
-    _qmlObjectBindings.insert(ast, value);
+    _qmlObjects.insert(ast, value);
     // ### FIXME: we don't handle dot-properties correctly (i.e. font.size)
 //    _currentObjectValue->setProperty(name, value);
 
diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h
index 10c74a18d64..d24075e2905 100644
--- a/src/libs/qmljs/qmljsbind.h
+++ b/src/libs/qmljs/qmljsbind.h
@@ -83,8 +83,7 @@ private:
     Interpreter::ObjectValue *_functionEnvironment;
     Interpreter::ObjectValue *_rootObjectValue;
 
-    QHash<AST::UiObjectDefinition *, Interpreter::ObjectValue *> _qmlObjectDefinitions;
-    QHash<AST::UiObjectBinding *, Interpreter::ObjectValue *> _qmlObjectBindings;
+    QHash<AST::Node *, Interpreter::ObjectValue *> _qmlObjects;
     QStringList _includedScripts;
     QStringList _localImports;
 
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index 3d654ad5c54..9bcefb52649 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -31,11 +31,7 @@ Link::~Link()
             bind->_idEnvironment->setScope(0);
             bind->_functionEnvironment->setScope(0);
 
-            foreach (ObjectValue *object, bind->_qmlObjectBindings) {
-                object->setPrototype(0);
-                object->setScope(0);
-            }
-            foreach (ObjectValue *object, bind->_qmlObjectDefinitions) {
+            foreach (ObjectValue *object, bind->_qmlObjects) {
                 object->setPrototype(0);
                 object->setScope(0);
             }
@@ -55,13 +51,9 @@ ObjectValue *Link::scopeChainAt(Document::Ptr doc, Node *currentObject)
 {
     BindPtr bind = doc->bind();
 
-    ObjectValue *scopeObject;
+    ObjectValue *scopeObject = 0;
     if (UiObjectDefinition *definition = cast<UiObjectDefinition *>(currentObject))
-        scopeObject = bind->_qmlObjectDefinitions.value(definition);
-    else if (UiObjectBinding *binding = cast<UiObjectBinding *>(currentObject))
-        scopeObject = bind->_qmlObjectBindings.value(binding);
-    else
-        return bind->_interp.globalObject();
+        scopeObject = bind->_qmlObjects.value(definition);
 
     if (!scopeObject)
         return bind->_interp.globalObject();
@@ -103,29 +95,14 @@ void Link::linkImports()
         populateImportedTypes(typeEnv, doc);
 
         // Set the prototypes.
-        {
-            QHash<UiObjectDefinition *, ObjectValue *>::iterator it = bind->_qmlObjectDefinitions.begin();
-            QHash<UiObjectDefinition *, ObjectValue *>::iterator end = bind->_qmlObjectDefinitions.end();
-            for (; it != end; ++it) {
-                UiObjectDefinition *key = it.key();
-                ObjectValue *value = it.value();
-                if (!key->qualifiedTypeNameId)
-                    continue;
-
-                value->setPrototype(lookupType(typeEnv, key->qualifiedTypeNameId));
-            }
-        }
-        {
-            QHash<UiObjectBinding *, ObjectValue *>::iterator it = bind->_qmlObjectBindings.begin();
-            QHash<UiObjectBinding *, ObjectValue *>::iterator end = bind->_qmlObjectBindings.end();
-            for (; it != end; ++it) {
-                UiObjectBinding *key = it.key();
-                ObjectValue *value = it.value();
-                if (!key->qualifiedTypeNameId)
-                    continue;
-
-                value->setPrototype(lookupType(typeEnv, key->qualifiedTypeNameId));
-            }
+        QHashIterator<Node *, ObjectValue *> it(bind->_qmlObjects);
+        while (it.hasNext()) {
+            it.next();
+            Node *binding = it.key();
+            ObjectValue *value = it.value();
+
+            if (UiQualifiedId *qualifiedId = qualifiedTypeNameId(binding))
+                value->setPrototype(lookupType(typeEnv, qualifiedId));
         }
     }
 }
@@ -290,6 +267,16 @@ const ObjectValue *Link::lookupType(ObjectValue *env, UiQualifiedId *id)
     return objectValue;
 }
 
+UiQualifiedId *Link::qualifiedTypeNameId(Node *node)
+{
+    if (UiObjectBinding *binding = AST::cast<UiObjectBinding *>(node))
+        return binding->qualifiedTypeNameId;
+    else if (UiObjectDefinition *binding = AST::cast<UiObjectDefinition *>(node))
+        return binding->qualifiedTypeNameId;
+    else
+        return 0;
+}
+
 QList<Document::Ptr> Link::reachableDocuments(Document::Ptr startDoc, const Snapshot &snapshot)
 {
     QList<Document::Ptr> docs;
diff --git a/src/libs/qmljs/qmljslink.h b/src/libs/qmljs/qmljslink.h
index 998c03dd685..33be4736d10 100644
--- a/src/libs/qmljs/qmljslink.h
+++ b/src/libs/qmljs/qmljslink.h
@@ -29,6 +29,7 @@ public:
 private:
     static QList<Document::Ptr> reachableDocuments(Document::Ptr startDoc, const Snapshot &snapshot);
     static const Interpreter::ObjectValue *lookupType(Interpreter::ObjectValue *env, AST::UiQualifiedId *id);
+    static AST::UiQualifiedId *qualifiedTypeNameId(AST::Node *node);
 
     void linkImports();
 
@@ -37,7 +38,7 @@ private:
                     AST::UiImport *import, const QString &startPath);
     void importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc,
                        AST::UiImport *import);
-    void importObject(BindPtr bind, const QString &name, Interpreter::ObjectValue *object, NameId* targetNamespace);
+    void importObject(BindPtr bind, const QString &name, Interpreter::ObjectValue *object, NameId* targetNamespace);    
 
 private:
     Snapshot _snapshot;
-- 
GitLab