aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmlplugindump
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-01-22 13:12:56 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-02-03 15:22:12 +0100
commit789929f939a60462373beae37ab4373809095cff (patch)
treed3ee9dadb901213940ba61748f303fd34ccab424 /tools/qmlplugindump
parent8ba73c0134f162afd9aa83b731a8147728642385 (diff)
Use QTypeRevision for all versions and revisions
In many places we carry major and minor versions or revisions that are loosely coupled to minor versions. As the Qt minor version resets now, we need to handle these things more systematically. In particular, we need to add a "major" part to revisions. QTypeRevision can express the current major/minor pairs more efficiently and can also be used to add a major version to revisions. This change does not change the semantics, yet, but only replaces the types. Change-Id: Ie58ba8114d7e4c6427f0f28716deee71995c0d24 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tools/qmlplugindump')
-rw-r--r--tools/qmlplugindump/main.cpp108
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) {