diff options
Diffstat (limited to 'src/plugins/qmljseditor/qmloutlinemodel.cpp')
-rw-r--r-- | src/plugins/qmljseditor/qmloutlinemodel.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 0cda207b51..c9853fbe91 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -120,7 +120,7 @@ QString QmlOutlineItem::prettyPrint(const Value *value, const ContextPtr &contex class ObjectMemberParentVisitor : public AST::Visitor { public: - QHash<AST::UiObjectMember*,AST::UiObjectMember*> operator()(Document::Ptr doc) { + QHash<AST::Node *,AST::UiObjectMember *> operator()(Document::Ptr doc) { parent.clear(); if (doc && doc->ast()) doc->ast()->accept(this); @@ -128,7 +128,7 @@ public: } private: - QHash<AST::UiObjectMember*,AST::UiObjectMember*> parent; + QHash<AST::Node *, AST::UiObjectMember *> parent; QList<AST::UiObjectMember *> stack; bool preVisit(AST::Node *node) override @@ -144,6 +144,9 @@ private: stack.removeLast(); if (!stack.isEmpty()) parent.insert(objMember, stack.last()); + } else if (AST::FunctionExpression *funcMember = node->asFunctionDefinition()) { + if (!stack.isEmpty()) + parent.insert(funcMember, stack.last()); } } @@ -497,6 +500,7 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD } else { // it's a grouped propery like 'anchors' data.insert(ItemTypeRole, NonElementBindingType); + data.insert(AnnotationRole, QString()); // clear possible former annotation icon = Icons::scriptBindingIcon(); } @@ -516,6 +520,7 @@ QModelIndex QmlOutlineModel::enterObjectBinding(AST::UiObjectBinding *objBinding bindingData.insert(Qt::DisplayRole, asString(objBinding->qualifiedId)); bindingData.insert(ItemTypeRole, ElementBindingType); + bindingData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *bindingItem = enterNode(bindingData, objBinding, objBinding->qualifiedId, Icons::scriptBindingIcon()); @@ -545,6 +550,7 @@ QModelIndex QmlOutlineModel::enterArrayBinding(AST::UiArrayBinding *arrayBinding bindingData.insert(Qt::DisplayRole, asString(arrayBinding->qualifiedId)); bindingData.insert(ItemTypeRole, ElementBindingType); + bindingData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(bindingData, arrayBinding, arrayBinding->qualifiedId, Icons::scriptBindingIcon()); @@ -617,6 +623,7 @@ QModelIndex QmlOutlineModel::enterFunctionDeclaration(AST::FunctionDeclaration * objectData.insert(Qt::DisplayRole, functionDisplayName(functionDeclaration->name, functionDeclaration->formals)); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, functionDeclaration, nullptr, Icons::functionDeclarationIcon()); @@ -648,6 +655,7 @@ QModelIndex QmlOutlineModel::enterFieldMemberExpression(AST::FieldMemberExpressi objectData.insert(Qt::DisplayRole, display); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, expression, nullptr, m_icons->functionDeclarationIcon()); @@ -666,6 +674,7 @@ QModelIndex QmlOutlineModel::enterTestCase(AST::ObjectPattern *objectLiteral) objectData.insert(Qt::DisplayRole, QLatin1String("testcase")); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item = enterNode(objectData, objectLiteral, nullptr, Icons::objectDefinitionIcon()); @@ -686,6 +695,7 @@ QModelIndex QmlOutlineModel::enterTestCaseProperties(AST::PatternPropertyList *p if (auto propertyName = AST::cast<const AST::IdentifierPropertyName *>(assignment->name)) { objectData.insert(Qt::DisplayRole, propertyName->id.toString()); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item; if (assignment->initializer->kind == AST::Node::Kind_FunctionExpression) item = enterNode(objectData, assignment, nullptr, Icons::functionDeclarationIcon()); @@ -702,6 +712,7 @@ QModelIndex QmlOutlineModel::enterTestCaseProperties(AST::PatternPropertyList *p if (auto propertyName = AST::cast<const AST::IdentifierPropertyName *>(getterSetter->name)) { objectData.insert(Qt::DisplayRole, propertyName->id.toString()); objectData.insert(ItemTypeRole, ElementBindingType); + objectData.insert(AnnotationRole, QString()); // clear possible former annotation QmlOutlineItem *item; item = enterNode(objectData, getterSetter, nullptr, Icons::functionDeclarationIcon()); @@ -840,9 +851,14 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q for (auto outlineItem : itemsToMove) { AST::UiObjectMember *sourceObjectMember = m_itemToNode.value(outlineItem)->uiObjectMemberCast(); - if (!sourceObjectMember) - return; + AST::FunctionExpression *functionMember = nullptr; + if (!sourceObjectMember) { + functionMember = m_itemToNode.value(outlineItem)->asFunctionDefinition(); + if (!functionMember) + return; + } + m_itemToNode.value(outlineItem)->asFunctionDefinition(); bool insertionOrderSpecified = true; AST::UiObjectMember *memberToInsertAfter = nullptr; { @@ -858,6 +874,9 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q if (sourceObjectMember) moveObjectMember(sourceObjectMember, targetObjectMember, insertionOrderSpecified, memberToInsertAfter, &changeSet, &range); + else if (functionMember) + moveObjectMember(functionMember, targetObjectMember, insertionOrderSpecified, + memberToInsertAfter, &changeSet, &range); changedRanges << range; } @@ -870,7 +889,7 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QList<Q file->apply(); } -void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, +void QmlOutlineModel::moveObjectMember(AST::Node *toMove, AST::UiObjectMember *newParent, bool insertionOrderSpecified, AST::UiObjectMember *insertAfter, @@ -881,7 +900,7 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, Q_ASSERT(newParent); Q_ASSERT(changeSet); - QHash<AST::UiObjectMember*, AST::UiObjectMember*> parentMembers; + QHash<AST::Node *, AST::UiObjectMember *> parentMembers; { ObjectMemberParentVisitor visitor; parentMembers = visitor(m_semanticInfo.document); @@ -891,8 +910,11 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, Q_ASSERT(oldParent); // make sure that target parent is actually a direct ancestor of target sibling - if (insertAfter) - newParent = parentMembers.value(insertAfter); + if (insertAfter) { + auto objMember = parentMembers.value(insertAfter); + Q_ASSERT(objMember); + newParent = objMember; + } const QString documentText = m_semanticInfo.document->source(); |