From 1a2e16aebdd719b84e6618dde5379a2bfb479235 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Mon, 27 Sep 2010 15:36:50 +0200
Subject: [PATCH] QmlOutline: Show functions in outline

Reviewed-by: Christiaan Janssen
(cherry picked from commit e871b7e3302aaa27a723c0cfc1635e47eba5c09a)
---
 src/libs/qmljs/images/func.png              | Bin 0 -> 583 bytes
 src/libs/qmljs/qmljs.qrc                    |   1 +
 src/libs/qmljs/qmljsicons.cpp               |   7 ++++
 src/libs/qmljs/qmljsicons.h                 |   1 +
 src/plugins/qmljseditor/qmloutlinemodel.cpp |  44 +++++++++++++++++++-
 src/plugins/qmljseditor/qmloutlinemodel.h   |   4 ++
 6 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 src/libs/qmljs/images/func.png

diff --git a/src/libs/qmljs/images/func.png b/src/libs/qmljs/images/func.png
new file mode 100644
index 0000000000000000000000000000000000000000..e515e76e61f64cd285a4c67aaf1feaca38e84f8b
GIT binary patch
literal 583
zcmV-N0=WH&P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz=}AOERCwB?lh02RK@`W|wA)H!ViQSR
z!T}Sr7)d-B2?;^)WFkF?9uz$w#EX9h2jamye*iab9!!WKnivD&gmRJtum-Dbw=A^m
zcIQXi?e6$?g|*a{9++e{yR+}}{mz^BhDa&lB0~ut^F%u@ruR}R_1*XVlv}Ia#BVcL
zT#$PBGuFi*gzwM2P+z}&lTIX)ySR3(IUv>zo|t>C4nNKiCDjAZW?rS0MB<DH3C^HR
z3V-2Qgr_n@{3?R$x=?rPkYE1>pH|-6UZWAF6YJzWK0B@6oq9-k)__{I3ie(Wa;qCq
z+5Zhg*R^yk9@nEo{11MK@S{mW^*qoYIVf-Iz$!L~s=&!X2oB)OIL7xYt?)gB?_?g3
z(#K7(cJ_f&3j72L1el<ZE#|o|<sdQzr5PTZd8*zX86kzG55OEJayxaVf<ewSLKw?f
zh*C%*JUabE9lCLg81KG-;4B0}=MWB@85E8VBIh%W<a>?F16TXV!RN2Q1^bt4^>o`D
zjPfCuEpXHajk>EXFD^P|s|1WwpxnVp@tpx>v?JWyNG8@*Tie=jj%_Ox;Q@?7MXS^i
zZtX<V^E_?)=Z;gMxC1<G)3(lq+x3Czqlj^Qs7tJKH@KYuoZPl62={k`gYidz0RS<7
VHwy_73zh%?002ovPDHLkV1oW+1Bd_s

literal 0
HcmV?d00001

diff --git a/src/libs/qmljs/qmljs.qrc b/src/libs/qmljs/qmljs.qrc
index 59c7cea4bdb..f7b88c2b242 100644
--- a/src/libs/qmljs/qmljs.qrc
+++ b/src/libs/qmljs/qmljs.qrc
@@ -3,5 +3,6 @@
         <file>images/element.png</file>
         <file>images/property.png</file>
 	<file>images/publicmember.png</file>
+	<file>images/func.png</file>
     </qresource>
 </RCC>
diff --git a/src/libs/qmljs/qmljsicons.cpp b/src/libs/qmljs/qmljsicons.cpp
index 964b7c9cc82..0cc415315f1 100644
--- a/src/libs/qmljs/qmljsicons.cpp
+++ b/src/libs/qmljs/qmljsicons.cpp
@@ -50,6 +50,7 @@ public:
     QIcon elementIcon;
     QIcon propertyIcon;
     QIcon publicMemberIcon;
+    QIcon functionDeclarationIcon;
     QHash<QPair<QString,QString>,QIcon> iconHash;
     QString resourcePath;
 };
@@ -62,6 +63,7 @@ Icons::Icons()
     m_d->elementIcon = QIcon(QLatin1String(":/qmljs/images/element.png"));
     m_d->propertyIcon = QIcon(QLatin1String(":/qmljs/images/property.png"));
     m_d->publicMemberIcon = QIcon(QLatin1String(":/qmljs/images/publicmember.png"));
+    m_d->functionDeclarationIcon = QIcon(QLatin1String(":/qmljs/images/func.png"));
 }
 
 Icons::~Icons()
@@ -141,3 +143,8 @@ QIcon Icons::publicMemberIcon() const
 {
     return m_d->publicMemberIcon;
 }
+
+QIcon Icons::functionDeclarationIcon() const
+{
+    return m_d->functionDeclarationIcon;
+}
diff --git a/src/libs/qmljs/qmljsicons.h b/src/libs/qmljs/qmljsicons.h
index 0382bfe722c..6eef01b620a 100644
--- a/src/libs/qmljs/qmljsicons.h
+++ b/src/libs/qmljs/qmljsicons.h
@@ -53,6 +53,7 @@ public:
     QIcon objectDefinitionIcon() const;
     QIcon scriptBindingIcon() const;
     QIcon publicMemberIcon() const;
+    QIcon functionDeclarationIcon() const;
 
 private:
     Icons();
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index 220ee4ac32d..595cf7afe7a 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -223,6 +223,19 @@ private:
         m_model->leavePublicMember();
     }
 
+    bool visit(AST::FunctionDeclaration *functionDeclaration)
+    {
+        QModelIndex index = m_model->enterFunctionDeclaration(functionDeclaration);
+        m_nodeToIndex.insert(functionDeclaration, index);
+
+        return true;
+    }
+
+    void endVisit(AST::FunctionDeclaration * /*functionDeclaration*/)
+    {
+        m_model->leaveFunctionDeclaration();
+    }
+
     QmlOutlineModel *m_model;
 
     QHash<AST::Node*, QModelIndex> m_nodeToIndex;
@@ -474,6 +487,23 @@ void QmlOutlineModel::leavePublicMember()
     leaveNode();
 }
 
+QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration *functionDeclaration)
+{
+    QMap<int, QVariant> objectData;
+
+    objectData.insert(Qt::DisplayRole, functionDeclaration->name->asString());
+    objectData.insert(ItemTypeRole, ElementBindingType);
+
+    QmlOutlineItem *item = enterNode(objectData, functionDeclaration, 0, m_icons->functionDeclarationIcon());
+
+    return item->index();
+}
+
+void QmlOutlineModel::leaveFunctionDeclaration()
+{
+    leaveNode();
+}
+
 AST::Node *QmlOutlineModel::nodeForIndex(const QModelIndex &index) const
 {
     QTC_ASSERT(index.isValid() && (index.model() == this), return 0);
@@ -491,8 +521,11 @@ AST::SourceLocation QmlOutlineModel::sourceLocation(const QModelIndex &index) co
     QTC_ASSERT(index.isValid() && (index.model() == this), return location);
     AST::Node *node = nodeForIndex(index);
     if (node) {
-        if (AST::UiObjectMember *member = node->uiObjectMemberCast())
+        if (AST::UiObjectMember *member = node->uiObjectMemberCast()) {
             location = getLocation(member);
+        } else if (AST::ExpressionNode *expression = node->expressionCast()) {
+            location = getLocation(expression);
+        }
     }
     return location;
 }
@@ -755,6 +788,15 @@ AST::SourceLocation QmlOutlineModel::getLocation(AST::UiObjectMember *objMember)
     return location;
 }
 
+AST::SourceLocation QmlOutlineModel::getLocation(AST::ExpressionNode *exprNode) {
+    AST::SourceLocation location;
+    location.offset = exprNode->firstSourceLocation().offset;
+    location.length = exprNode->lastSourceLocation().offset
+            - exprNode->firstSourceLocation().offset
+            + exprNode->lastSourceLocation().length;
+    return location;
+}
+
 QIcon QmlOutlineModel::getIcon(AST::UiQualifiedId *qualifiedId) {
     const Interpreter::Value *value = m_context->evaluate(qualifiedId);
 
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h
index 9bd7c1c1333..8d31ee7c68b 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.h
+++ b/src/plugins/qmljseditor/qmloutlinemodel.h
@@ -89,6 +89,9 @@ private:
     QModelIndex enterPublicMember(QmlJS::AST::UiPublicMember *publicMember);
     void leavePublicMember();
 
+    QModelIndex enterFunctionDeclaration(QmlJS::AST::FunctionDeclaration *functionDeclaration);
+    void leaveFunctionDeclaration();
+
 private:
     QmlOutlineItem *enterNode(QMap<int, QVariant> data, QmlJS::AST::Node *node, QmlJS::AST::UiQualifiedId *idNode, const QIcon &icon);
     void leaveNode();
@@ -102,6 +105,7 @@ private:
 
     static QString asString(QmlJS::AST::UiQualifiedId *id);
     static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::UiObjectMember *objMember);
+    static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::ExpressionNode *exprNode);
     QIcon getIcon(QmlJS::AST::UiQualifiedId *objDef);
 
     QString getAnnotation(QmlJS::AST::UiObjectInitializer *objInitializer);
-- 
GitLab