diff --git a/src/libs/qmljs/images/func.png b/src/libs/qmljs/images/func.png new file mode 100644 index 0000000000000000000000000000000000000000..e515e76e61f64cd285a4c67aaf1feaca38e84f8b Binary files /dev/null and b/src/libs/qmljs/images/func.png differ diff --git a/src/libs/qmljs/qmljs.qrc b/src/libs/qmljs/qmljs.qrc index 59c7cea4bdb57e98c8ca91a2f9c8ead073ea899b..f7b88c2b24299b0e45191d824a8556ff131dba18 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 964b7c9cc82f2f0a94c4b1f175993cb3870d7ad6..0cc415315f19e6b418f921103e3dd83798dc5b99 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 0382bfe722c88f49bf19db295969eb26fd0b278b..6eef01b620ae375b9f443cd04dec59789ae3f4ba 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 220ee4ac32dfa37d5ca741c6eb6b9531417b20a0..595cf7afe7aacd3af05de55133c8f1344a7e393d 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 9bd7c1c133330a2cbd5289665544c81ef432da35..8d31ee7c68b53ecae1191b529817da0f3513ab67 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);