From f4130410d36edd80adbcb576d0ac137f8e167190 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 5 Oct 2011 11:42:33 +0200 Subject: qmlplugindump: Dump QObject based module api. Change-Id: Icc18392f63cd505e0264567e6c7d2d4cf7dac021 Reviewed-by: Fawzi Mohamed --- tools/qmlplugindump/main.cpp | 62 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) (limited to 'tools') diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index b4cf2da3ff..19e94c2652 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -148,7 +148,17 @@ QByteArray convertToId(const QByteArray &cppName) return cppToId.value(cppName, cppName); } -QSet collectReachableMetaObjects(const QList &skip = QList()) +/* All exported module APIs are collected into this list */ +class ModuleApi { +public: + QString uri; + int majorVersion; + int minorVersion; + QByteArray objectId; +}; +QList moduleApis; + +QSet collectReachableMetaObjects(QDeclarativeEngine *engine, const QList &skip = QList()) { QSet metas; metas.insert(FriendlyQObject::qtMeta()); @@ -221,6 +231,33 @@ QSet collectReachableMetaObjects(const QList > moduleApiIt(QDeclarativeMetaType::moduleApis()); + while (moduleApiIt.hasNext()) { + moduleApiIt.next(); + foreach (const QDeclarativeMetaType::ModuleApi &api, moduleApiIt.value()) { + ModuleApi moduleApi; + moduleApi.uri = moduleApiIt.key(); + moduleApi.majorVersion = api.major; + moduleApi.minorVersion = api.minor; + + if (api.qobject) { + if (QObject *object = (*api.qobject)(engine, engine)) { + collectReachableMetaObjects(object, &metas); + moduleApi.objectId = convertToId(object->metaObject()->className()); + delete object; + } + } else if (api.script) { + qWarning() << "Can't dump the module api in " << moduleApi.uri << ". QJSValue based module API is not supported."; +// QJSValue value = (*api.script)(engine, engine); +// IdToObjectHash jsObjects; +// collectReachableJSObjects(value, &jsObjects, &metas); + } + + moduleApis += moduleApi; + } + } + return metas; } @@ -318,9 +355,21 @@ public: qml->writeEndObject(); } + void dump(const ModuleApi &api) + { + qml->writeStartObject(QLatin1String("ModuleApi")); + if (api.uri != relocatableModuleUri) + qml->writeScriptBinding(QLatin1String("uri"), enquote(api.uri)); + qml->writeScriptBinding(QLatin1String("version"), QString("%1.%2").arg( + QString::number(api.majorVersion), + QString::number(api.minorVersion))); + qml->writeScriptBinding(QLatin1String("name"), enquote(api.objectId)); + qml->writeEndObject(); + } + void writeEasingCurve() { - qml->writeStartObject("Component"); + qml->writeStartObject(QLatin1String("Component")); qml->writeScriptBinding(QLatin1String("name"), enquote(QLatin1String("QEasingCurve"))); qml->writeScriptBinding(QLatin1String("prototype"), enquote(QLatin1String("QDeclarativeEasingValueType"))); qml->writeEndObject(); @@ -582,7 +631,7 @@ int main(int argc, char *argv[]) } // find all QMetaObjects reachable from the builtin module - QSet defaultReachable = collectReachableMetaObjects(); + QSet defaultReachable = collectReachableMetaObjects(&engine); QList defaultTypes = QDeclarativeMetaType::qmlTypes(); // add some otherwise unreachable QMetaObjects @@ -633,7 +682,7 @@ int main(int argc, char *argv[]) } } - QSet candidates = collectReachableMetaObjects(defaultTypes); + QSet candidates = collectReachableMetaObjects(&engine, defaultTypes); candidates.subtract(defaultReachable); // Also eliminate meta objects with the same classname. @@ -681,6 +730,11 @@ int main(int argc, char *argv[]) if (pluginImportUri.isEmpty()) dumper.writeEasingCurve(); + // write out module api elements + foreach (const ModuleApi &api, moduleApis) { + dumper.dump(api); + } + qml.writeEndObject(); qml.writeEndDocument(); -- cgit v1.2.3