diff --git a/src/libs/qmljs/qmljsrewriter.cpp b/src/libs/qmljs/qmljsrewriter.cpp index a6601fb33de50c9fcd8a1bbe695282997342d1a0..17293b34f6ef4fae57d74e29633a5f7bbfd2991c 100644 --- a/src/libs/qmljs/qmljsrewriter.cpp +++ b/src/libs/qmljs/qmljsrewriter.cpp @@ -175,6 +175,39 @@ UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *memb return lastNonObjectDef; } +UiArrayMemberList *Rewriter::searchMemberToInsertAfter(UiArrayMemberList *members, + const QStringList &propertyOrder) +{ + const int objectDefinitionInsertionPoint = propertyOrder.indexOf(QString::null); + + UiArrayMemberList *lastObjectDef = 0; + UiArrayMemberList *lastNonObjectDef = 0; + + for (UiArrayMemberList *iter = members; iter; iter = iter->next) { + UiObjectMember *member = iter->member; + int idx = -1; + + if (cast<UiObjectDefinition*>(member)) + lastObjectDef = iter; + else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) + idx = propertyOrder.indexOf(flatten(arrayBinding->qualifiedId)); + else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) + idx = propertyOrder.indexOf(flatten(objectBinding->qualifiedId)); + else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) + idx = propertyOrder.indexOf(flatten(scriptBinding->qualifiedId)); + else if (cast<UiPublicMember*>(member)) + idx = propertyOrder.indexOf(QLatin1String("property")); + + if (idx < objectDefinitionInsertionPoint) + lastNonObjectDef = iter; + } + + if (lastObjectDef) + return lastObjectDef; + else + return lastNonObjectDef; +} + UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder) @@ -619,6 +652,29 @@ Rewriter::Range Rewriter::addObject(UiObjectInitializer *ast, const QString &con return Range(insertionPoint, insertionPoint); } +Rewriter::Range Rewriter::addObject(UiArrayBinding *ast, const QString &content) +{ + UiArrayMemberList *insertAfter = searchMemberToInsertAfter(ast->members, m_propertyOrder); + return addObject(ast, content, insertAfter); +} + +Rewriter::Range Rewriter::addObject(UiArrayBinding *ast, const QString &content, UiArrayMemberList *insertAfter) +{ + int insertionPoint; + QString textToInsert; + if (insertAfter && insertAfter->member) { + insertionPoint = insertAfter->member->lastSourceLocation().end(); + textToInsert += QLatin1String("\n"); + } else { + insertionPoint = ast->lbracketToken.end(); + } + + textToInsert += content; + m_changeSet->insert(insertionPoint, QLatin1String("\n") + textToInsert); + + return Range(insertionPoint, insertionPoint); +} + void Rewriter::removeObjectMember(UiObjectMember *member, UiObjectMember *parent) { int start = member->firstSourceLocation().offset; diff --git a/src/libs/qmljs/qmljsrewriter.h b/src/libs/qmljs/qmljsrewriter.h index 6d03f24e56e8bde30a580ff0c78b4ad457bcf59d..d11db08ca16270e13aca42d55d7c7daf773cf1c0 100644 --- a/src/libs/qmljs/qmljsrewriter.h +++ b/src/libs/qmljs/qmljsrewriter.h @@ -77,10 +77,13 @@ public: Range addObject(AST::UiObjectInitializer *ast, const QString &content); Range addObject(AST::UiObjectInitializer *ast, const QString &content, AST::UiObjectMemberList *insertAfter); + Range addObject(AST::UiArrayBinding *ast, const QString &content); + Range addObject(AST::UiArrayBinding *ast, const QString &content, AST::UiArrayMemberList *insertAfter); void removeObjectMember(AST::UiObjectMember *member, AST::UiObjectMember *parent); static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QStringList &propertyOrder); + static AST::UiArrayMemberList *searchMemberToInsertAfter(AST::UiArrayMemberList *members, const QStringList &propertyOrder); static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder); static QString flatten(AST::UiQualifiedId *first); diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 20b0515c5743c4d0897d284d05e87fc5f4aeeae8..5a409af2489048c1f00c628d72b599e8a3230c76 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -669,12 +669,9 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, const QString documentText = m_semanticInfo.document->source(); - if (AST::UiObjectDefinition *objDefinition = AST::cast<AST::UiObjectDefinition*>(newParent)) { - // target is an element - - Rewriter rewriter(documentText, changeSet, QStringList()); - rewriter.removeObjectMember(toMove, oldParent); + Rewriter rewriter(documentText, changeSet, QStringList()); + if (AST::UiObjectDefinition *objDefinition = AST::cast<AST::UiObjectDefinition*>(newParent)) { AST::UiObjectMemberList *listInsertAfter = 0; if (insertionOrderSpecified) { if (insertAfter) { @@ -713,9 +710,36 @@ void QmlOutlineModel::moveObjectMember(AST::UiObjectMember *toMove, *addedRange = rewriter.addObject(objDefinition->initializer, strToMove); } } - } else { + } else if (AST::UiArrayBinding *arrayBinding = AST::cast<AST::UiArrayBinding*>(newParent)) { + AST::UiArrayMemberList *listInsertAfter = 0; + if (insertionOrderSpecified) { + if (insertAfter) { + listInsertAfter = arrayBinding->members; + while (listInsertAfter && (listInsertAfter->member != insertAfter)) + listInsertAfter = listInsertAfter->next; + } + } + QString strToMove; + { + const int offset = toMove->firstSourceLocation().begin(); + const int length = toMove->lastSourceLocation().end() - offset; + strToMove = documentText.mid(offset, length); + } + + if (insertionOrderSpecified) { + *addedRange = rewriter.addObject(arrayBinding, strToMove, listInsertAfter); + } else { + *addedRange = rewriter.addObject(arrayBinding, strToMove); + } + } else if (AST::UiObjectBinding *objectBinding = AST::cast<AST::UiObjectBinding*>(newParent)) { + qDebug() << "TODO: Reparent to UiObjectBinding"; + return; // target is a property + } else { + return; } + + rewriter.removeObjectMember(toMove, oldParent); } QStandardItem *QmlOutlineModel::parentItem()