aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmljseditor/qmloutlinemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmljseditor/qmloutlinemodel.cpp')
-rw-r--r--src/plugins/qmljseditor/qmloutlinemodel.cpp38
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();