diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-09-25 13:49:10 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-09-25 15:20:48 +0200 |
commit | c734eb3a8bda3b24721d80c380189c5e754a9b38 (patch) | |
tree | 03da6141209e6cd45cb9c22d2c3c549d64526064 /tools/qmlplugindump | |
parent | bd7df60ac506226ab9f4eb6be3dcebf14253244a (diff) |
qmlplugindump: fix prototypeNameForComposite
We do not put the objects we encounter in defaultReachaleNames. Thus,
the check in prototypeNameForComposite will fail most of the time.
Instead, we now use the same check as in collectReachableMetaObjects
(that is, does the type belong to the module).
Then, we once again only collect the metaobjects belonging to the module
in objectsToMerge, and only dump the relevant properties from there.
Fixes: QTBUG-78744
Change-Id: I78cae1e56b6f59e277198f9bcd0d826c4e0978a7
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tools/qmlplugindump')
-rw-r--r-- | tools/qmlplugindump/main.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index f0ed1f8ebe..4733a8f676 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -436,10 +436,11 @@ public: } QString getPrototypeNameForCompositeType(const QMetaObject *metaObject, QSet<QByteArray> &defaultReachableNames, - QList<const QMetaObject *> *objectsToMerge) + QList<const QMetaObject *> *objectsToMerge, const QmlVersionInfo &versionInfo) { + auto ty = QQmlMetaType::qmlType(metaObject); QString prototypeName; - if (!defaultReachableNames.contains(metaObject->className())) { + if (matchingImportUri(ty, versionInfo)) { // dynamic meta objects can break things badly // but extended types are usually fine const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate *>(metaObject->d.data); @@ -451,20 +452,20 @@ public: prototypeName = "QObject"; else prototypeName = getPrototypeNameForCompositeType( - superMetaObject, defaultReachableNames, objectsToMerge); + superMetaObject, defaultReachableNames, objectsToMerge, versionInfo); } else { prototypeName = convertToId(metaObject->className()); } return prototypeName; } - void dumpComposite(QQmlEngine *engine, const QSet<QQmlType> &compositeType, QSet<QByteArray> &defaultReachableNames) + void dumpComposite(QQmlEngine *engine, const QSet<QQmlType> &compositeType, QSet<QByteArray> &defaultReachableNames, const QmlVersionInfo &versionInfo) { for (const QQmlType &type : compositeType) - dumpCompositeItem(engine, type, defaultReachableNames); + dumpCompositeItem(engine, type, defaultReachableNames, versionInfo); } - void dumpCompositeItem(QQmlEngine *engine, const QQmlType &compositeType, QSet<QByteArray> &defaultReachableNames) + void dumpCompositeItem(QQmlEngine *engine, const QQmlType &compositeType, QSet<QByteArray> &defaultReachableNames, const QmlVersionInfo &versionInfo) { QQmlComponent e(engine, compositeType.sourceUrl()); if (!e.isReady()) { @@ -486,7 +487,7 @@ public: KnownAttributes knownAttributes; // Get C++ base class name for the composite type QString prototypeName = getPrototypeNameForCompositeType(mainMeta, defaultReachableNames, - &objectsToMerge); + &objectsToMerge, versionInfo); qml->writeScriptBinding(QLatin1String("prototype"), enquote(prototypeName)); QString qmlTyName = compositeType.qmlTypeName(); @@ -1228,6 +1229,7 @@ int main(int argc, char *argv[]) QMap<QString, QSet<QQmlType>> compositeTypes; int majorVersion = qtQmlMajorVersion, minorVersion = qtQmlMinorVersion; + QmlVersionInfo info; if (action == Builtins) { QSet<const QMetaObject *> builtins = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, defaultCompositeTypes, {QLatin1String("Qt"), majorVersion, minorVersion}); Q_ASSERT(builtins.size() == 1); @@ -1289,8 +1291,8 @@ int main(int argc, char *argv[]) return EXIT_IMPORTERROR; } } - - QSet<const QMetaObject *> candidates = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, compositeTypes, {pluginImportUri, majorVersion, minorVersion}, defaultTypes); + info = {pluginImportUri, majorVersion, minorVersion}; + QSet<const QMetaObject *> candidates = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, compositeTypes, info, defaultTypes); for (QString iter: compositeTypes.keys()) { if (defaultCompositeTypes.contains(iter)) { @@ -1350,7 +1352,7 @@ int main(int argc, char *argv[]) QMap<QString, QSet<QQmlType> >::const_iterator iter = compositeTypes.constBegin(); for (; iter != compositeTypes.constEnd(); ++iter) - dumper.dumpComposite(&engine, iter.value(), defaultReachableNames); + dumper.dumpComposite(&engine, iter.value(), defaultReachableNames, info); // define QEasingCurve as an extension of QQmlEasingValueType, this way // properties using the QEasingCurve type get useful type information. |