From 619d50f080793e1eae789642c3cce449669dc41e Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Tue, 1 Jun 2010 12:03:17 +0200
Subject: [PATCH] QmlJS: Make the qmldump tool treat extended types correctly.

---
 src/tools/qml/qmldump/main.cpp | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/tools/qml/qmldump/main.cpp b/src/tools/qml/qmldump/main.cpp
index 6a8f8a43a25..a8d1fd6b1d0 100644
--- a/src/tools/qml/qmldump/main.cpp
+++ b/src/tools/qml/qmldump/main.cpp
@@ -275,17 +275,35 @@ int main(int argc, char *argv[])
 
     metas.insert(FriendlyQObject::qtMeta());
 
-    // ### TODO: We don't treat extended types correctly. Currently only hits the
-    // QDeclarativeGraphicsWidget extension to QGraphicsWidget
+    QMultiHash<QByteArray, QByteArray> extensions;
     foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) {
-        if (ty->isExtendedType())
-            continue;
-
-        cppToQml.insert(ty->metaObject()->className(), ty->qmlTypeName());
         qmlTypeByCppName.insert(ty->metaObject()->className(), ty);
+        if (ty->isExtendedType()) {
+            extensions.insert(ty->typeName(), ty->metaObject()->className());
+        } else {
+            cppToQml.insert(ty->metaObject()->className(), ty->qmlTypeName());
+        }
         processDeclarativeType(ty, &metas);
     }
 
+    // Adjust qml names of extended objects.
+    // The chain ends up being:
+    // __extended__.originalname - the base object
+    // __extension_0_.originalname - first extension
+    // ..
+    // __extension_n-2_.originalname - second to last extension
+    // originalname - last extension
+    foreach (const QByteArray &extendedCpp, extensions.keys()) {
+        const QByteArray extendedQml = cppToQml.value(extendedCpp);
+        cppToQml.insert(extendedCpp, "__extended__." + extendedQml);
+        QList<QByteArray> extensionCppNames = extensions.values(extendedCpp);
+        for (int i = 0; i < extensionCppNames.size() - 1; ++i) {
+            QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(i), QString(extendedQml)).toAscii();
+            cppToQml.insert(extensionCppNames.value(i), adjustedName);
+        }
+        cppToQml.insert(extensionCppNames.last(), extendedQml);
+    }
+
     foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) {
         if (ty->isExtendedType())
             continue;
-- 
GitLab