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