diff options
author | Shawn Rutledge <shawn.rutledge@digia.com> | 2014-09-25 18:28:27 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@digia.com> | 2014-10-01 14:40:52 +0200 |
commit | 3ec6520117ffde0dfa2e029ca3214986506c54d8 (patch) | |
tree | 074273448a53e29969e9d284a021b6c722e8fafb /tools/qmlimportscanner | |
parent | 564c1038d1645d76004ad93651aa392d71d45490 (diff) |
qmlimportscanner: parse "depends" lines in qmldir files
These lines specify additional hidden dependencies. The first use case
is in QtQuick.Dialogs: DefaultFileDialog.qml uses FolderListModel, but
this file is not listed in the qmldir because the decision whether to
use it is made at runtime. So QtQuick.Dialogs qmldir contains this:
depends Qt.labs.folderlistmodel 1.0
Task-number: QTBUG-41489
Change-Id: Ide4bca2ce2e342b95e9a87cc418d26f331372d12
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'tools/qmlimportscanner')
-rw-r--r-- | tools/qmlimportscanner/main.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp index 102b5ada6e..6f5ec28c4d 100644 --- a/tools/qmlimportscanner/main.cpp +++ b/tools/qmlimportscanner/main.cpp @@ -124,6 +124,7 @@ QVariantMap pluginsForModulePath(const QString &modulePath) { // a qml import may contain several plugins QString plugins; QString classnames; + QStringList dependencies; QByteArray line; do { line = qmldirFile.readLine(); @@ -133,6 +134,12 @@ QVariantMap pluginsForModulePath(const QString &modulePath) { } else if (line.startsWith("classname")) { classnames += QString::fromUtf8(line.split(' ').at(1)); classnames += QStringLiteral(" "); + } else if (line.startsWith("depends")) { + QList<QByteArray> dep = line.split(' '); + if (dep.length() != 3) + std::cerr << "depends: expected 2 arguments: module identifier and version" << std::endl; + else + dependencies << QString::fromUtf8(dep[1]) + QStringLiteral(" ") + QString::fromUtf8(dep[2]).simplified(); } } while (line.length() > 0); @@ -140,6 +147,8 @@ QVariantMap pluginsForModulePath(const QString &modulePath) { QVariantMap pluginInfo; pluginInfo[QStringLiteral("plugins")] = plugins.simplified(); pluginInfo[QStringLiteral("classnames")] = classnames.simplified(); + if (dependencies.length()) + pluginInfo[QStringLiteral("dependencies")] = dependencies; return pluginInfo; } @@ -173,9 +182,10 @@ QString resolveImportPath(const QString &uri, const QString &version) QVariantList findPathsForModuleImports(const QVariantList &imports) { QVariantList done; + QVariantList importsCopy(imports); - foreach (QVariant importVariant, imports) { - QVariantMap import = qvariant_cast<QVariantMap>(importVariant); + for (int i = 0; i < importsCopy.length(); ++i) { + QVariantMap import = qvariant_cast<QVariantMap>(importsCopy[i]); if (import[QStringLiteral("type")] == QStringLiteral("module")) { QString path = resolveImportPath(import.value(QStringLiteral("name")).toString(), import.value(QStringLiteral("version")).toString()); if (!path.isEmpty()) @@ -187,6 +197,17 @@ QVariantList findPathsForModuleImports(const QVariantList &imports) import[QStringLiteral("plugin")] = plugins; if (!classnames.isEmpty()) import[QStringLiteral("classname")] = classnames; + if (plugininfo.contains(QStringLiteral("dependencies"))) { + QStringList dependencies = plugininfo.value(QStringLiteral("dependencies")).toStringList(); + foreach (QString line, dependencies) { + QList<QString> dep = line.split(QStringLiteral(" ")); + QVariantMap depImport; + depImport[QStringLiteral("type")] = QStringLiteral("module"); + depImport[QStringLiteral("name")] = dep[0]; + depImport[QStringLiteral("version")] = dep[1]; + importsCopy.append(depImport); + } + } } done.append(import); } |