Fixed a bug where a property could be inserted after an object.

This commit is contained in:
Erik Verbruggen
2010-02-15 15:04:25 +01:00
parent 83e40337d9
commit dc859db169
4 changed files with 34 additions and 5 deletions

View File

@@ -72,7 +72,7 @@ bool AddObjectVisitor::visit(QmlJS::AST::UiObjectDefinition *ast)
void AddObjectVisitor::insertInto(QmlJS::AST::UiObjectInitializer *ast) void AddObjectVisitor::insertInto(QmlJS::AST::UiObjectInitializer *ast)
{ {
UiObjectMemberList *insertAfter = searchMemberToInsertAfter(ast->members, QString(), m_propertyOrder); UiObjectMemberList *insertAfter = searchMemberToInsertAfter(ast->members, m_propertyOrder);
int insertionPoint; int insertionPoint;
int depth; int depth;

View File

@@ -87,7 +87,7 @@ private:
{ {
if (targetPropertyName.isEmpty()) { if (targetPropertyName.isEmpty()) {
// insert as UiObjectDefinition: // insert as UiObjectDefinition:
UiObjectMemberList *insertAfter = searchMemberToInsertAfter(ast->members, QString(), propertyOrder); UiObjectMemberList *insertAfter = searchMemberToInsertAfter(ast->members, propertyOrder);
if (insertAfter && insertAfter->member) { if (insertAfter && insertAfter->member) {
moveInfo.destination = insertAfter->member->lastSourceLocation().end(); moveInfo.destination = insertAfter->member->lastSourceLocation().end();

View File

@@ -270,6 +270,34 @@ void QMLRewriter::includeLeadingEmptyLine(int &start) const
start = prevBlock.position(); start = prevBlock.position();
} }
UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *members, const QStringList &propertyOrder)
{
const int objectDefinitionInsertionPoint = propertyOrder.indexOf(QString::null);
UiObjectMemberList *previous = 0;
for (UiObjectMemberList *iter = members; iter; iter = iter->next) {
UiObjectMember *member = iter->member;
int idx = -1;
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 (cast<UiObjectDefinition*>(member))
idx = propertyOrder.indexOf(QString::null);
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)
return iter;
previous = iter;
}
return previous;
}
UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder) UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder)
{ {
if (!members) if (!members)
@@ -298,9 +326,9 @@ UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *m
if (idx == -1) if (idx == -1)
idx = propertyOrder.size() - 1; idx = propertyOrder.size() - 1;
for (; idx >= 0; --idx) { for (; idx > 0; --idx) {
const QString prop = propertyOrder.at(idx); const QString prop = propertyOrder.at(idx - 1);
UiObjectMemberList *candidate = orderedMembers[prop]; UiObjectMemberList *candidate = orderedMembers.value(prop, 0);
if (candidate != 0) if (candidate != 0)
return candidate; return candidate;
} }

View File

@@ -79,6 +79,7 @@ protected:
bool includeSurroundingWhitespace(int &start, int &end) const; bool includeSurroundingWhitespace(int &start, int &end) const;
void includeLeadingEmptyLine(int &start) const; void includeLeadingEmptyLine(int &start) const;
static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QStringList &propertyOrder);
static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder); static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder);
protected: protected: