From 2e949c70157d6c7a210d1c8c41e3d2e057a4f93b Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Wed, 21 Jul 2010 13:49:14 +0200
Subject: [PATCH] QmlJS Rewriter: Remove empty grouped properties

Also remove grouped properties if the last member is removed via removeObjectMember
(removeBindingByName already takes care of this).
---
 src/libs/qmljs/qmljsrewriter.cpp | 20 ++++++++++++++++++++
 src/libs/qmljs/qmljsrewriter.h   |  2 +-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/libs/qmljs/qmljsrewriter.cpp b/src/libs/qmljs/qmljsrewriter.cpp
index 61d56a2e069..a6601fb33de 100644
--- a/src/libs/qmljs/qmljsrewriter.cpp
+++ b/src/libs/qmljs/qmljsrewriter.cpp
@@ -490,6 +490,23 @@ void Rewriter::includeLeadingEmptyLine(const QString &source, int &start)
     start = prevBlock.position();
 }
 
+void Rewriter::includeEmptyGroupedProperty(UiObjectDefinition *groupedProperty, UiObjectMember *memberToBeRemoved, int &start, int &end)
+{
+    if (groupedProperty->qualifiedTypeNameId
+            && groupedProperty->qualifiedTypeNameId->name->asString().at(0).isLower()) {
+        // grouped property
+        UiObjectMemberList *memberIter = groupedProperty->initializer->members;
+        while (memberIter) {
+            if (memberIter->member != memberToBeRemoved) {
+                return;
+            }
+            memberIter = memberIter->next;
+        }
+        start = groupedProperty->firstSourceLocation().begin();
+        end = groupedProperty->lastSourceLocation().end();
+    }
+}
+
 #if 0
 UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *members, const QStringList &propertyOrder)
 {
@@ -610,6 +627,9 @@ void Rewriter::removeObjectMember(UiObjectMember *member, UiObjectMember *parent
     if (UiArrayBinding *parentArray = cast<UiArrayBinding *>(parent)) {
         extendToLeadingOrTrailingComma(parentArray, member, start, end);
     } else {
+        if (UiObjectDefinition *parentObjectDefinition = cast<UiObjectDefinition *>(parent)) {
+            includeEmptyGroupedProperty(parentObjectDefinition, member, start, end);
+        }
         includeSurroundingWhitespace(m_originalText, start, end);
     }
 
diff --git a/src/libs/qmljs/qmljsrewriter.h b/src/libs/qmljs/qmljsrewriter.h
index 318a74ecc13..6d03f24e56e 100644
--- a/src/libs/qmljs/qmljsrewriter.h
+++ b/src/libs/qmljs/qmljsrewriter.h
@@ -78,7 +78,6 @@ public:
     Range addObject(AST::UiObjectInitializer *ast, const QString &content);
     Range addObject(AST::UiObjectInitializer *ast, const QString &content, AST::UiObjectMemberList *insertAfter);
 
-
     void removeObjectMember(AST::UiObjectMember *member, AST::UiObjectMember *parent);
 
     static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QStringList &propertyOrder);
@@ -87,6 +86,7 @@ public:
 
     static bool includeSurroundingWhitespace(const QString &source, int &start, int &end);
     static void includeLeadingEmptyLine(const QString &source, int &start);
+    static void includeEmptyGroupedProperty(AST::UiObjectDefinition *groupedProperty, AST::UiObjectMember *memberToBeRemoved, int &start, int &end);
 
 private:
     void replaceMemberValue(AST::UiObjectMember *propertyMember,
-- 
GitLab