diff options
Diffstat (limited to 'tools/qmlplugindump/main.cpp')
-rw-r--r-- | tools/qmlplugindump/main.cpp | 111 |
1 files changed, 82 insertions, 29 deletions
diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index 6248d3dc64..070ea041d6 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -32,6 +32,7 @@ ****************************************************************************/ #include <QtQml/qqmlengine.h> +#include <QtQml/private/qqmlengine_p.h> #include <QtQml/private/qqmlmetatype_p.h> #include <QtQml/private/qqmlopenmetaobject_p.h> #include <QtQuick/private/qquickevents_p_p.h> @@ -74,6 +75,10 @@ #include <qt_windows.h> #endif + +static const uint qtQmlMajorVersion = 2; +static const uint qtQmlMinorVersion = 2; + QString pluginImportPath; bool verbose = false; bool creatable = true; @@ -129,11 +134,11 @@ void collectReachableMetaObjects(QObject *object, QSet<const QMetaObject *> *met } } -void collectReachableMetaObjects(const QQmlType *ty, QSet<const QMetaObject *> *metas) +void collectReachableMetaObjects(QQmlEnginePrivate *engine, const QQmlType *ty, QSet<const QMetaObject *> *metas) { collectReachableMetaObjects(ty->metaObject(), metas, ty->isExtendedType()); - if (ty->attachedPropertiesType()) - collectReachableMetaObjects(ty->attachedPropertiesType(), metas); + if (ty->attachedPropertiesType(engine)) + collectReachableMetaObjects(ty->attachedPropertiesType(engine), metas); } /* We want to add the MetaObject for 'Qt' to the list, this is a @@ -151,8 +156,9 @@ public: */ static QHash<QByteArray, QSet<const QQmlType *> > qmlTypesByCppName; -// No different versioning possible for a composite type. -static QMap<QString, const QQmlType * > qmlTypesByCompositeName; +/* A composite type is completely specified by name, major version and minor version. +*/ +static QMap<QString, QSet<const QQmlType *> > qmlTypesByCompositeName; static QHash<QByteArray, QByteArray> cppToId; @@ -195,13 +201,13 @@ QByteArray convertToId(const QMetaObject *mo) // Collect all metaobjects for types registered with qmlRegisterType() without parameters -void collectReachableMetaObjectsWithoutQmlName( QSet<const QMetaObject *>& metas ) { +void collectReachableMetaObjectsWithoutQmlName(QQmlEnginePrivate *engine, QSet<const QMetaObject *>& metas ) { foreach (const QQmlType *ty, QQmlMetaType::qmlAllTypes()) { if ( ! metas.contains(ty->metaObject()) ) { if (!ty->isComposite()) { - collectReachableMetaObjects(ty, &metas); + collectReachableMetaObjects(engine, ty, &metas); } else { - qmlTypesByCompositeName[ty->elementName()] = ty; + qmlTypesByCompositeName[ty->elementName()].insert(ty); } } } @@ -225,9 +231,9 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine, qmlTypesByCppName[ty->metaObject()->className()].insert(ty); if (ty->isExtendedType()) extensions[ty->typeName()].insert(ty->metaObject()->className()); - collectReachableMetaObjects(ty, &metas); + collectReachableMetaObjects(QQmlEnginePrivate::get(engine), ty, &metas); } else { - qmlTypesByCompositeName[ty->elementName()] = ty; + qmlTypesByCompositeName[ty->elementName()].insert(ty); } } @@ -324,7 +330,7 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine, } } - collectReachableMetaObjectsWithoutQmlName(metas); + collectReachableMetaObjectsWithoutQmlName(QQmlEnginePrivate::get(engine), metas); return metas; } @@ -374,7 +380,7 @@ public: if (qmlTyName.startsWith("./")) { qmlTyName.remove(0, 2); } - if (qmlTyName.startsWith("/")) { + if (qmlTyName.startsWith(QLatin1Char('/'))) { qmlTyName.remove(0, 1); } const QString exportString = enquote( @@ -458,7 +464,13 @@ public: return prototypeName; } - void dumpComposite(QQmlEngine *engine, const QQmlType *compositeType, QSet<QByteArray> &defaultReachableNames) + void dumpComposite(QQmlEngine *engine, const QSet<const QQmlType *> &compositeType, QSet<QByteArray> &defaultReachableNames) + { + foreach (const QQmlType *type, compositeType) + dumpCompositeItem(engine, type, defaultReachableNames); + } + + void dumpCompositeItem(QQmlEngine *engine, const QQmlType *compositeType, QSet<QByteArray> &defaultReachableNames) { QQmlComponent e(engine, compositeType->sourceUrl()); if (!e.isReady()) { @@ -484,9 +496,8 @@ public: qml->writeScriptBinding(QLatin1String("prototype"), enquote(prototypeName)); QString qmlTyName = compositeType->qmlTypeName(); - // name should be unique - qml->writeScriptBinding(QLatin1String("name"), enquote(qmlTyName)); const QString exportString = getExportString(qmlTyName, compositeType->majorVersion(), compositeType->minorVersion()); + qml->writeScriptBinding(QLatin1String("name"), exportString); qml->writeArrayBinding(QLatin1String("exports"), QStringList() << exportString); qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() << QString::number(compositeType->minorVersion())); qml->writeBooleanBinding(QLatin1String("isComposite"), true); @@ -510,7 +521,7 @@ public: qml->writeEndObject(); } - void dump(const QMetaObject *meta, bool isUncreatable, bool isSingleton) + void dump(QQmlEnginePrivate *engine, const QMetaObject *meta, bool isUncreatable, bool isSingleton) { qml->writeStartObject("Component"); @@ -556,7 +567,7 @@ public: } qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), metaObjectRevisions); - if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType()) { + if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType(engine)) { // Can happen when a type is registered that returns itself as attachedPropertiesType() // because there is no creatable type to attach to. if (attachedType != meta) { @@ -691,7 +702,9 @@ private: qml->writeScriptBinding(QLatin1String("name"), enquote(QString::fromUtf8(e.name()))); QList<QPair<QString, QString> > namesValues; - for (int index = 0; index < e.keyCount(); ++index) { + const int keyCount = e.keyCount(); + namesValues.reserve(keyCount); + for (int index = 0; index < keyCount; ++index) { namesValues.append(qMakePair(enquote(QString::fromUtf8(e.key(index))), QString::number(e.value(index)))); } @@ -733,7 +746,7 @@ static bool readDependenciesData(QString dependenciesFile, const QByteArray &fil std::cerr << "parsing " << qPrintable( dependenciesFile ) << " skipping"; foreach (const QString &uriToSkip, urisToSkip) - std::cerr << " " << qPrintable(uriToSkip); + std::cerr << ' ' << qPrintable(uriToSkip); std::cerr << std::endl; } QJsonParseError parseError; @@ -781,9 +794,9 @@ static bool readDependenciesData(QString dependenciesFile, const QByteArray &fil return true; } -static bool readDependenciesFile(QString dependenciesFile, QStringList *dependencies, +static bool readDependenciesFile(const QString &dependenciesFile, QStringList *dependencies, const QStringList &urisToSkip) { - if (!QFileInfo(dependenciesFile).exists()) { + if (!QFileInfo::exists(dependenciesFile)) { std::cerr << "non existing dependencies file " << dependenciesFile.toStdString() << std::endl; return false; @@ -826,7 +839,7 @@ static bool getDependencies(const QQmlEngine &engine, const QString &pluginImpor if (!importScanner.waitForFinished()) { std::cerr << "failure to start " << qPrintable(command); foreach (const QString &arg, commandArgs) - std::cerr << " " << qPrintable(arg); + std::cerr << ' ' << qPrintable(arg); std::cerr << std::endl; return false; } @@ -836,6 +849,14 @@ static bool getDependencies(const QQmlEngine &engine, const QString &pluginImpor std::cerr << "failed to proecess output of qmlimportscanner" << std::endl; return false; } + + QStringList aux; + foreach (const QString &str, *dependencies) { + if (!str.startsWith("Qt.test.qtestroot")) + aux += str; + } + *dependencies = aux; + return true; } @@ -1047,9 +1068,13 @@ int main(int argc, char *argv[]) getDependencies(engine, pluginImportUri, pluginImportVersion, &dependencies); compactDependencies(&dependencies); - // load the QtQml 2.2 builtins and the dependencies + QString qtQmlImportString = QString::fromLatin1("import QtQml %1.%2") + .arg(qtQmlMajorVersion) + .arg(qtQmlMinorVersion); + + // load the QtQml builtins and the dependencies { - QByteArray code("import QtQml 2.2"); + QByteArray code(qtQmlImportString.toUtf8()); foreach (const QString &moduleToImport, dependencies) { code.append("\nimport "); code.append(moduleToImport.toUtf8()); @@ -1080,14 +1105,40 @@ int main(int argc, char *argv[]) QSet<const QMetaObject *> metas; if (action == Builtins) { + foreach (const QMetaObject *m, defaultReachable) { + if (m->className() == QLatin1String("Qt")) { + metas.insert(m); + break; + } + } + } else if (pluginImportUri == QLatin1String("QtQml")) { + bool ok = false; + const uint major = pluginImportVersion.split('.')[0].toUInt(&ok, 10); + if (!ok) { + std::cerr << "Malformed version string \""<< qPrintable(pluginImportVersion) << "\"." + << std::endl; + return EXIT_INVALIDARGUMENTS; + } + if (major != qtQmlMajorVersion) { + std::cerr << "Unsupported version \"" << qPrintable(pluginImportVersion) + << "\": Major version number must be \"" << qtQmlMajorVersion << "\"." + << std::endl; + return EXIT_INVALIDARGUMENTS; + } metas = defaultReachable; + foreach (const QMetaObject *m, defaultReachable) { + if (m->className() == QLatin1String("Qt")) { + metas.remove(m); + break; + } + } } else { // find a valid QtQuick import QByteArray importCode; QQmlType *qtObjectType = QQmlMetaType::qmlType(&QObject::staticMetaObject); if (!qtObjectType) { std::cerr << "Could not find QtObject type" << std::endl; - importCode = QByteArray("import QtQml 2.2"); + importCode = qtQmlImportString.toUtf8(); } else { QString module = qtObjectType->qmlTypeName(); module = module.mid(0, module.lastIndexOf(QLatin1Char('/'))); @@ -1155,7 +1206,7 @@ int main(int argc, char *argv[]) "//\n" "// This file was auto-generated by:\n" "// '%1 %2'\n" - "\n").arg(QFileInfo(args.at(0)).fileName()).arg(QStringList(args.mid(1)).join(QLatin1String(" ")))); + "\n").arg(QFileInfo(args.at(0)).baseName(), args.mid(1).join(QLatin1Char(' ')))); qml.writeStartObject("Module"); QStringList quotedDependencies; foreach (const QString &dep, dependencies) @@ -1171,10 +1222,12 @@ int main(int argc, char *argv[]) if (relocatable) dumper.setRelocatableModuleUri(pluginImportUri); foreach (const QMetaObject *meta, nameToMeta) { - dumper.dump(meta, uncreatableMetas.contains(meta), singletonMetas.contains(meta)); + dumper.dump(QQmlEnginePrivate::get(&engine), meta, uncreatableMetas.contains(meta), singletonMetas.contains(meta)); } - foreach (const QQmlType *compositeType, qmlTypesByCompositeName) - dumper.dumpComposite(&engine, compositeType, defaultReachableNames); + + QMap<QString, QSet<const QQmlType *> >::const_iterator iter = qmlTypesByCompositeName.constBegin(); + for (; iter != qmlTypesByCompositeName.constEnd(); ++iter) + dumper.dumpComposite(&engine, iter.value(), defaultReachableNames); // define QEasingCurve as an extension of QQmlEasingValueType, this way // properties using the QEasingCurve type get useful type information. |