diff options
Diffstat (limited to 'tools/qmlplugindump/main.cpp')
-rw-r--r-- | tools/qmlplugindump/main.cpp | 108 |
1 files changed, 61 insertions, 47 deletions
diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index 947b5dff27..3efa4dc605 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -103,15 +103,15 @@ static QString enquote(const QString &string) struct QmlVersionInfo { QString pluginImportUri; - int majorVersion; - int minorVersion; + QTypeRevision version; bool strict; }; static bool matchingImportUri(const QQmlType &ty, const QmlVersionInfo& versionInfo) { if (versionInfo.strict) { return (versionInfo.pluginImportUri == ty.module() - && (ty.majorVersion() == versionInfo.majorVersion || ty.majorVersion() == -1)) + && (ty.version().majorVersion() == versionInfo.version.majorVersion() + || !ty.version().hasMajorVersion())) || ty.module().isEmpty(); } return ty.module().isEmpty() @@ -335,23 +335,23 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine, } class KnownAttributes { - QHash<QByteArray, int> m_properties; - QHash<QByteArray, QHash<int, int> > m_methods; + QHash<QByteArray, QTypeRevision> m_properties; + QHash<QByteArray, QHash<int, QTypeRevision> > m_methods; public: - bool knownMethod(const QByteArray &name, int nArgs, int revision) + bool knownMethod(const QByteArray &name, int nArgs, QTypeRevision revision) { if (m_methods.contains(name)) { - QHash<int, int> overloads = m_methods.value(name); - if (overloads.contains(nArgs) && overloads.value(nArgs) <= revision) + QHash<int, QTypeRevision> overloads = m_methods.value(name); + if (overloads.contains(nArgs) && overloads.value(nArgs).toEncodedVersion<quint16>() <= revision.toEncodedVersion<quint16>()) return true; } m_methods[name][nArgs] = revision; return false; } - bool knownProperty(const QByteArray &name, int revision) + bool knownProperty(const QByteArray &name, QTypeRevision revision) { - if (m_properties.contains(name) && m_properties.value(name) <= revision) + if (m_properties.contains(name) && m_properties.value(name).toEncodedVersion<quint16>() <= revision.toEncodedVersion<quint16>()) return true; m_properties[name] = revision; return false; @@ -375,13 +375,14 @@ public: { const QString module = type.module().isEmpty() ? versionInfo.pluginImportUri : type.module(); - const int majorVersion = type.majorVersion() >= 0 ? type.majorVersion() - : versionInfo.majorVersion; - const int minorVersion = type.minorVersion() >= 0 ? type.minorVersion() - : versionInfo.minorVersion; + QTypeRevision version = QTypeRevision::fromVersion( + type.version().hasMajorVersion() ? type.version().majorVersion() + : versionInfo.version.majorVersion(), + type.version().hasMinorVersion() ? type.version().minorVersion() + : versionInfo.version.minorVersion()); const QString versionedElement = type.elementName() - + QString::fromLatin1(" %1.%2").arg(majorVersion).arg(minorVersion); + + QString::fromLatin1(" %1.%2").arg(version.majorVersion()).arg(version.minorVersion()); return enquote((module == relocatableModuleUri) ? versionedElement @@ -390,7 +391,7 @@ public: void writeMetaContent(const QMetaObject *meta, KnownAttributes *knownAttributes = nullptr) { - QSet<QString> implicitSignals = dumpMetaProperties(meta, 0, knownAttributes); + QSet<QString> implicitSignals = dumpMetaProperties(meta, QTypeRevision::zero(), knownAttributes); if (meta == &QObject::staticMetaObject) { // for QObject, hide deleteLater() and onDestroyed @@ -405,17 +406,17 @@ public: } // and add toString(), destroy() and destroy(int) - if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("toString"), 0, 0)) { + if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("toString"), 0, QTypeRevision::zero())) { qml->writeStartObject(QLatin1String("Method")); qml->writeScriptBinding(QLatin1String("name"), enquote(QLatin1String("toString"))); qml->writeEndObject(); } - if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 0, 0)) { + if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 0, QTypeRevision::zero())) { qml->writeStartObject(QLatin1String("Method")); qml->writeScriptBinding(QLatin1String("name"), enquote(QLatin1String("destroy"))); qml->writeEndObject(); } - if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 1, 0)) { + if (!knownAttributes || !knownAttributes->knownMethod(QByteArray("destroy"), 1, QTypeRevision::zero())) { qml->writeStartObject(QLatin1String("Method")); qml->writeScriptBinding(QLatin1String("name"), enquote(QLatin1String("destroy"))); qml->writeStartObject(QLatin1String("Parameter")); @@ -498,7 +499,12 @@ public: qml->writeScriptBinding(QLatin1String("name"), exportString); qml->writeArrayBinding(QLatin1String("exports"), QStringList() << exportString); - qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() << QString::number(compositeType.minorVersion())); + + // TODO: shouldn't this be metaObjectRevision().value<quint16>() + // rather than version().minorVersion() + qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() + << QString::number(compositeType.version().minorVersion())); + qml->writeBooleanBinding(QLatin1String("isComposite"), true); if (compositeType.isSingleton()) { @@ -537,10 +543,10 @@ public: struct QmlTypeInfo { QmlTypeInfo() {} - QmlTypeInfo(const QString &exportString, int revision, const QMetaObject *extendedObject, QByteArray attachedTypeId) + QmlTypeInfo(const QString &exportString, QTypeRevision revision, const QMetaObject *extendedObject, QByteArray attachedTypeId) : exportString(exportString), revision(revision), extendedObject(extendedObject), attachedTypeId(attachedTypeId) {} QString exportString; - int revision = 0; + QTypeRevision revision = QTypeRevision::zero(); const QMetaObject *extendedObject = nullptr; QByteArray attachedTypeId; }; @@ -563,11 +569,11 @@ public: if (attachedType != meta) attachedTypeId = convertToId(attachedType); } - const QString exportString = getExportString(type, { QString(), -1, -1, false }); - int metaObjectRevision = type.metaObjectRevision(); + const QString exportString = getExportString(type, { QString(), QTypeRevision(), false }); + QTypeRevision metaObjectRevision = type.metaObjectRevision(); if (extendedObject) { // emulate custom metaobjectrevision out of import - metaObjectRevision = type.majorVersion() * 100 + type.minorVersion(); + metaObjectRevision = type.version(); } QmlTypeInfo info = { exportString, metaObjectRevision, extendedObject, attachedTypeId }; @@ -576,7 +582,7 @@ public: // sort to ensure stable output std::sort(typeInfo.begin(), typeInfo.end(), [](const QmlTypeInfo &i1, const QmlTypeInfo &i2) { - return i1.revision < i2.revision; + return i1.revision.toEncodedVersion<quint16>() < i2.revision.toEncodedVersion<quint16>(); }); // determine default property @@ -600,7 +606,7 @@ public: if (!typeInfo.isEmpty()) { QMap<QString, QString> exports; // sort exports for (const QmlTypeInfo &iter : typeInfo) - exports.insert(iter.exportString, QString::number(iter.revision)); + exports.insert(iter.exportString, QString::number(iter.revision.toEncodedVersion<quint16>())); QStringList exportStrings = exports.keys(); QStringList metaObjectRevisions = exports.values(); @@ -681,22 +687,27 @@ private: qml->writeScriptBinding(QLatin1String("isPointer"), QLatin1String("true")); } - void dump(const QMetaProperty &prop, int metaRevision = -1, KnownAttributes *knownAttributes = nullptr) + void dump(const QMetaProperty &prop, QTypeRevision metaRevision = QTypeRevision(), + KnownAttributes *knownAttributes = nullptr) { - int revision = metaRevision ? metaRevision : prop.revision(); + // TODO: should that not be metaRevision.isValid() rather than comparing to zero()? + QTypeRevision revision = (metaRevision == QTypeRevision::zero()) + ? QTypeRevision::fromEncodedVersion(prop.revision()) + : metaRevision; QByteArray propName = prop.name(); if (knownAttributes && knownAttributes->knownProperty(propName, revision)) return; qml->writeStartObject("Property"); qml->writeScriptBinding(QLatin1String("name"), enquote(QString::fromUtf8(prop.name()))); - if (revision) - qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision)); + if (revision != QTypeRevision::zero()) + qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision.toEncodedVersion<quint16>())); writeTypeProperties(prop.typeName(), prop.isWritable()); qml->writeEndObject(); } - QSet<QString> dumpMetaProperties(const QMetaObject *meta, int metaRevision = -1, KnownAttributes *knownAttributes = nullptr) + QSet<QString> dumpMetaProperties(const QMetaObject *meta, QTypeRevision metaRevision = QTypeRevision(), + KnownAttributes *knownAttributes = nullptr) { QSet<QString> implicitSignals; for (int index = meta->propertyOffset(); index < meta->propertyCount(); ++index) { @@ -704,7 +715,7 @@ private: dump(property, metaRevision, knownAttributes); if (knownAttributes) knownAttributes->knownMethod(QByteArray(property.name()).append("Changed"), - 0, property.revision()); + 0, QTypeRevision::fromEncodedVersion(property.revision())); implicitSignals.insert(QString("%1Changed").arg(QString::fromUtf8(property.name()))); } return implicitSignals; @@ -732,7 +743,7 @@ private: return; } - int revision = meth.revision(); + QTypeRevision revision = QTypeRevision::fromEncodedVersion(meth.revision()); if (knownAttributes && knownAttributes->knownMethod(name, meth.parameterNames().size(), revision)) return; if (meth.methodType() == QMetaMethod::Signal) @@ -742,8 +753,8 @@ private: qml->writeScriptBinding(QLatin1String("name"), enquote(name)); - if (revision) - qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision)); + if (revision != QTypeRevision::zero()) + qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision.toEncodedVersion<quint16>())); if (typeName != QLatin1String("void")) qml->writeScriptBinding(QLatin1String("type"), enquote(typeName)); @@ -1001,9 +1012,9 @@ static bool operator<(const QQmlType &a, const QQmlType &b) { return a.qmlTypeName() < b.qmlTypeName() || (a.qmlTypeName() == b.qmlTypeName() - && ((a.majorVersion() < b.majorVersion()) - || (a.majorVersion() == b.majorVersion() - && a.minorVersion() < b.minorVersion()))); + && ((a.version().majorVersion() < b.version().majorVersion()) + || (a.version().majorVersion() == b.version().majorVersion() + && a.version().minorVersion() < b.version().minorVersion()))); } QT_END_NAMESPACE @@ -1243,11 +1254,13 @@ int main(int argc, char *argv[]) // composite types we want to dump information of QMap<QString, QList<QQmlType>> compositeTypes; - int majorVersion = qtQmlMajorVersion, minorVersion = qtQmlMinorVersion; + QTypeRevision version = QTypeRevision::fromVersion(qtQmlMajorVersion, qtQmlMinorVersion); QmlVersionInfo info; if (action == Builtins) { QMap<QString, QList<QQmlType>> defaultCompositeTypes; - QSet<const QMetaObject *> builtins = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, defaultCompositeTypes, {QLatin1String("Qt"), majorVersion, minorVersion, strict}); + QSet<const QMetaObject *> builtins = collectReachableMetaObjects( + &engine, uncreatableMetas, singletonMetas, defaultCompositeTypes, + {QLatin1String("Qt"), version, strict}); Q_ASSERT(builtins.size() == 1); metas.insert(*builtins.begin()); } else { @@ -1256,12 +1269,13 @@ int main(int argc, char *argv[]) if (!ok) qCritical("Invalid version number"); else { - majorVersion = versionSplitted.at(0).toInt(&ok); + const int majorVersion = versionSplitted.at(0).toInt(&ok); if (!ok) qCritical("Invalid major version"); - minorVersion = versionSplitted.at(1).toInt(&ok); + const int minorVersion = versionSplitted.at(1).toInt(&ok); if (!ok) qCritical("Invalid minor version"); + version = QTypeRevision::fromVersion(majorVersion, minorVersion); } QList<QQmlType> defaultTypes = QQmlMetaType::qmlTypes(); // find a valid QtQuick import @@ -1273,9 +1287,9 @@ int main(int argc, char *argv[]) } else { QString module = qtObjectType.qmlTypeName(); module = module.mid(0, module.lastIndexOf(QLatin1Char('/'))); - importCode = QString("import %1 %2.%3").arg(module, - QString::number(qtObjectType.majorVersion()), - QString::number(qtObjectType.minorVersion())).toUtf8(); + importCode = QString("import %1 %2.%3").arg( + module, QString::number(qtObjectType.version().majorVersion()), + QString::number(qtObjectType.version().minorVersion())).toUtf8(); } // avoid importing dependencies? for (const QString &moduleToImport : qAsConst(dependencies)) { @@ -1307,7 +1321,7 @@ int main(int argc, char *argv[]) return EXIT_IMPORTERROR; } } - info = {pluginImportUri, majorVersion, minorVersion, strict}; + info = {pluginImportUri, version, strict}; QSet<const QMetaObject *> candidates = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas, compositeTypes, info, defaultTypes); for (auto it = compositeTypes.begin(), end = compositeTypes.end(); it != end; ++it) { |