From 745d16b47d2cae2bb5596fda8094f18e0c4dfe41 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 10 Aug 2010 16:33:23 +0200
Subject: [PATCH] QmlOutline: Add support UiArrayBinding, UiObjectBinding

---
 src/plugins/qmljseditor/qmloutlinemodel.cpp | 101 ++++++++++++++++++--
 src/plugins/qmljseditor/qmloutlinemodel.h   |  12 ++-
 2 files changed, 102 insertions(+), 11 deletions(-)

diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index ea1eed01fbf..441fd99c7e5 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -211,6 +211,31 @@ private:
         m_model->leaveObjectDefiniton();
     }
 
+    bool visit(AST::UiObjectBinding *objBinding)
+    {
+        QModelIndex index = m_model->enterObjectBinding(objBinding);
+        m_nodeToIndex.insert(objBinding, index);
+        return true;
+    }
+
+    void endVisit(AST::UiObjectBinding * /*objBinding*/)
+    {
+        m_model->leaveObjectBinding();
+    }
+
+    bool visit(AST::UiArrayBinding *arrayBinding)
+    {
+        QModelIndex index = m_model->enterArrayBinding(arrayBinding);
+        m_nodeToIndex.insert(arrayBinding, index);
+
+        return true;
+    }
+
+    void endVisit(AST::UiArrayBinding * /*arrayBinding*/)
+    {
+        m_model->leaveArrayBinding();
+    }
+
     bool visit(AST::UiScriptBinding *scriptBinding)
     {
         QModelIndex index = m_model->enterScriptBinding(scriptBinding);
@@ -373,9 +398,9 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD
 
     if (typeName.at(0).isUpper()) {
         prototype.setText(typeName);
-        prototype.setAnnotation(getAnnotation(objDef));
+        prototype.setAnnotation(getAnnotation(objDef->initializer));
         if (!m_typeToIcon.contains(typeName)) {
-            m_typeToIcon.insert(typeName, getIcon(objDef));
+            m_typeToIcon.insert(typeName, getIcon(objDef->qualifiedTypeNameId));
         }
         prototype.setIcon(m_typeToIcon.value(typeName));
         prototype.setData(ElementType, ItemTypeRole);
@@ -397,6 +422,65 @@ void QmlOutlineModel::leaveObjectDefiniton()
     leaveNode();
 }
 
+QModelIndex QmlOutlineModel::enterObjectBinding(AST::UiObjectBinding *objBinding)
+{
+    QmlOutlineItem bindingPrototype(this);
+
+    bindingPrototype.setText(asString(objBinding->qualifiedId));
+    bindingPrototype.setIcon(m_icons->scriptBindingIcon());
+    bindingPrototype.setData(PropertyType, ItemTypeRole);
+    bindingPrototype.setNode(objBinding);
+    bindingPrototype.setSourceLocation(getLocation(objBinding));
+    bindingPrototype.setIdNode(objBinding->qualifiedId);
+
+    enterNode(bindingPrototype);
+
+    QmlOutlineItem objectPrototype(this);
+
+    const QString typeName = asString(objBinding->qualifiedTypeNameId);
+    objectPrototype.setText(typeName);
+    objectPrototype.setAnnotation(getAnnotation(objBinding->initializer));
+    if (!m_typeToIcon.contains(typeName)) {
+        m_typeToIcon.insert(typeName, getIcon(objBinding->qualifiedTypeNameId));
+    }
+    objectPrototype.setIcon(m_typeToIcon.value(typeName));
+    objectPrototype.setData(ElementType, ItemTypeRole);
+    objectPrototype.setIdNode(objBinding->qualifiedTypeNameId);
+    objectPrototype.setNode(objBinding);
+    objectPrototype.setSourceLocation(getLocation(objBinding));
+
+    enterNode(objectPrototype);
+
+    return bindingPrototype.index();
+}
+
+void QmlOutlineModel::leaveObjectBinding()
+{
+    leaveNode();
+    leaveNode();
+}
+
+QModelIndex QmlOutlineModel::enterArrayBinding(AST::UiArrayBinding *arrayBinding)
+{
+    QmlOutlineItem bindingPrototype(this);
+
+    bindingPrototype.setText(asString(arrayBinding->qualifiedId));
+    bindingPrototype.setIcon(m_icons->scriptBindingIcon());
+    bindingPrototype.setData(PropertyType, ItemTypeRole);
+    bindingPrototype.setNode(arrayBinding);
+    bindingPrototype.setSourceLocation(getLocation(arrayBinding));
+    bindingPrototype.setIdNode(arrayBinding->qualifiedId);
+
+    enterNode(bindingPrototype);
+
+    return bindingPrototype.index();
+}
+
+void QmlOutlineModel::leaveArrayBinding()
+{
+    leaveNode();
+}
+
 QModelIndex QmlOutlineModel::enterScriptBinding(AST::UiScriptBinding *scriptBinding)
 {
     QmlOutlineItem prototype(this);
@@ -666,8 +750,8 @@ AST::SourceLocation QmlOutlineModel::getLocation(AST::UiObjectMember *objMember)
     return location;
 }
 
-QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) {
-    const QmlJS::Interpreter::Value *value = m_context->evaluate(objDef->qualifiedTypeNameId);
+QIcon QmlOutlineModel::getIcon(AST::UiQualifiedId *qualifiedId) {
+    const QmlJS::Interpreter::Value *value = m_context->evaluate(qualifiedId);
 
     if (const Interpreter::ObjectValue *objectValue = value->asObjectValue()) {
         do {
@@ -689,8 +773,8 @@ QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) {
     return QIcon();
 }
 
-QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) {
-    const QHash<QString,QString> bindings = getScriptBindings(objDef);
+QString QmlOutlineModel::getAnnotation(AST::UiObjectInitializer *objectInitializer) {
+    const QHash<QString,QString> bindings = getScriptBindings(objectInitializer);
 
     if (bindings.contains("id"))
         return bindings.value("id");
@@ -701,12 +785,13 @@ QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) {
     if (bindings.contains("target"))
         return bindings.value("target");
 
+
     return QString();
 }
 
-QHash<QString,QString> QmlOutlineModel::getScriptBindings(AST::UiObjectDefinition *objDef) {
+QHash<QString,QString> QmlOutlineModel::getScriptBindings(AST::UiObjectInitializer *objectInitializer) {
     QHash <QString,QString> scriptBindings;
-    for (AST::UiObjectMemberList *it = objDef->initializer->members; it; it = it->next) {
+    for (AST::UiObjectMemberList *it = objectInitializer->members; it; it = it->next) {
         if (AST::UiScriptBinding *binding = AST::cast<AST::UiScriptBinding*>(it->member)) {
             const QString bindingName = asString(binding->qualifiedId);
             AST::ExpressionStatement *expr = AST::cast<AST::ExpressionStatement*>(binding->statement);
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h
index 647a382b308..f65bf4c3ca9 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.h
+++ b/src/plugins/qmljseditor/qmloutlinemodel.h
@@ -88,6 +88,12 @@ private:
     QModelIndex enterObjectDefinition(QmlJS::AST::UiObjectDefinition *objectDefinition);
     void leaveObjectDefiniton();
 
+    QModelIndex enterObjectBinding(QmlJS::AST::UiObjectBinding *objectBinding);
+    void leaveObjectBinding();
+
+    QModelIndex enterArrayBinding(QmlJS::AST::UiArrayBinding *arrayBinding);
+    void leaveArrayBinding();
+
     QModelIndex enterScriptBinding(QmlJS::AST::UiScriptBinding *scriptBinding);
     void leaveScriptBinding();
 
@@ -107,10 +113,10 @@ private:
 
     static QString asString(QmlJS::AST::UiQualifiedId *id);
     static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::UiObjectMember *objMember);
-    QIcon getIcon(QmlJS::AST::UiObjectDefinition *objDef);
+    QIcon getIcon(QmlJS::AST::UiQualifiedId *objDef);
 
-    static QString getAnnotation(QmlJS::AST::UiObjectDefinition *objDef);
-    static QHash<QString,QString> getScriptBindings(QmlJS::AST::UiObjectDefinition *objDefinition);
+    static QString getAnnotation(QmlJS::AST::UiObjectInitializer *objInitializer);
+    static QHash<QString,QString> getScriptBindings(QmlJS::AST::UiObjectInitializer *objInitializer);
 
 
     SemanticInfo m_semanticInfo;
-- 
GitLab