aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@digia.com>2014-09-25 18:28:27 +0200
committerShawn Rutledge <shawn.rutledge@digia.com>2014-10-01 14:40:52 +0200
commit3ec6520117ffde0dfa2e029ca3214986506c54d8 (patch)
tree074273448a53e29969e9d284a021b6c722e8fafb /tools
parent564c1038d1645d76004ad93651aa392d71d45490 (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')
-rw-r--r--tools/qmlimportscanner/main.cpp25
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);
}