summaryrefslogtreecommitdiff
path: root/src/tools/qml/qmldump/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/qml/qmldump/main.cpp')
-rw-r--r--src/tools/qml/qmldump/main.cpp39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/tools/qml/qmldump/main.cpp b/src/tools/qml/qmldump/main.cpp
index adf3bf5395..4dcdb0156c 100644
--- a/src/tools/qml/qmldump/main.cpp
+++ b/src/tools/qml/qmldump/main.cpp
@@ -9,7 +9,10 @@
#include <QDebug>
#include <iostream>
#include <QtDeclarative>
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/private/qmetaobject_p.h>
#include <QtDeclarative/private/qdeclarativemetatype_p.h>
+#include <QtDeclarative/private/qdeclarativeopenmetaobject_p.h>
#include <QtDeclarative/QDeclarativeView>
static QHash<QByteArray, const QDeclarativeType *> qmlTypeByCppName;
@@ -46,7 +49,11 @@ void processMetaObject(const QMetaObject *meta, QSet<const QMetaObject *> *metas
if (! meta || metas->contains(meta))
return;
- metas->insert(meta);
+ // dynamic meta objects break things badly
+ const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate *>(meta->d.data);
+ if (!(mop->flags & DynamicMetaObject))
+ metas->insert(meta);
+
processMetaObject(meta->superClass(), metas);
}
@@ -275,17 +282,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;