qmlplugindump: For extended types, remove exports of the base object.
authorChristian Kamm <christian.d.kamm@nokia.com>
Wed, 22 Jun 2011 15:13:56 +0000 (17:13 +0200)
committerChristian Kamm <christian.d.kamm@nokia.com>
Thu, 23 Jun 2011 08:48:09 +0000 (10:48 +0200)
Reviewed-by: Kai Koehne
(cherry picked from commit 21af9f0be1dd0d9be6c3767074fdfbd54e3b8372)

tools/qmlplugindump/main.cpp

index ca7745a..7e50118 100644 (file)
@@ -160,29 +160,36 @@ QSet<const QMetaObject *> collectReachableMetaObjects(const QString &importCode,
         collectReachableMetaObjects(ty, &metas);
     }
 
-    // Adjust ids 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
-    // ### does this actually work for multiple extensions? it seems like the prototypes might be wrong
-    foreach (const QByteArray &extendedCpp, extensions.keys()) {
-        cppToId.remove(extendedCpp);
-        const QByteArray extendedId = convertToId(extendedCpp);
-        cppToId.insert(extendedCpp, "__extended__." + extendedId);
-        QSet<QByteArray> extensionCppNames = extensions.value(extendedCpp);
-        int c = 0;
+    // Adjust exports of the base object if there are extensions.
+    // For each export of a base object there can be a single extension object overriding it.
+    // Example: QDeclarativeGraphicsWidget overrides the QtQuick/QGraphicsWidget export
+    //          of QGraphicsWidget.
+    foreach (const QByteArray &baseCpp, extensions.keys()) {
+        QSet<const QDeclarativeType *> baseExports = qmlTypesByCppName.value(baseCpp);
+
+        const QSet<QByteArray> extensionCppNames = extensions.value(baseCpp);
         foreach (const QByteArray &extensionCppName, extensionCppNames) {
-            if (c != extensionCppNames.size() - 1) {
-                QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(c), QString(extendedId)).toAscii();
-                cppToId.insert(extensionCppName, adjustedName);
-            } else {
-                cppToId.insert(extensionCppName, extendedId);
+            const QSet<const QDeclarativeType *> extensionExports = qmlTypesByCppName.value(extensionCppName);
+
+            // remove extension exports from base imports
+            // unfortunately the QDeclarativeType pointers don't match, so can't use QSet::substract
+            QSet<const QDeclarativeType *> newBaseExports;
+            foreach (const QDeclarativeType *baseExport, baseExports) {
+                bool match = false;
+                foreach (const QDeclarativeType *extensionExport, extensionExports) {
+                    if (baseExport->module() == extensionExport->module()
+                            && baseExport->majorVersion() == extensionExport->majorVersion()
+                            && baseExport->minorVersion() == extensionExport->minorVersion()) {
+                        match = true;
+                        break;
+                    }
+                }
+                if (!match)
+                    newBaseExports.insert(baseExport);
             }
-            ++c;
+            baseExports = newBaseExports;
         }
+        qmlTypesByCppName[baseCpp] = baseExports;
     }
 
     // find even more QMetaObjects by instantiating QML types and running