From 1a2e16aebdd719b84e6618dde5379a2bfb479235 Mon Sep 17 00:00:00 2001 From: Kai Koehne 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 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFuwG3aSW-rwPf;ne_=8*t(SefQ)*P zb?LGu$8#o55~m|Nf;^OLtp2*l?ken-c)zdVfewq)a{<0Nk|KS4O3#gZpH%mrW)A;- z;^6c32Uvek&;D9+Tc+oe;&k1DE9||yR_p5PS*5OK=?PwN=b-1uxs0h>l<(Z}P`efy zefw5HU#_;uL&hE_*VR`9^WM5#{%n)``*~mR!X3;uxtF({YrXxo@#W%images/element.png images/property.png images/publicmember.png + images/func.png 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,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 m_nodeToIndex; @@ -474,6 +487,23 @@ void QmlOutlineModel::leavePublicMember() leaveNode(); } +QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration *functionDeclaration) +{ + QMap 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 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);