aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmlimportscanner/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/qmlimportscanner/main.cpp')
-rw-r--r--tools/qmlimportscanner/main.cpp67
1 files changed, 49 insertions, 18 deletions
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp
index ac4f6ae437..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);
}
@@ -194,16 +215,8 @@ QVariantList findPathsForModuleImports(const QVariantList &imports)
}
// Scan a single qml file for import statements
-QVariantList findQmlImportsInQmlFile(const QString &filePath)
+static QVariantList findQmlImportsInQmlCode(const QString &filePath, const QString &code)
{
- QFile file(filePath);
- if (!file.open(QIODevice::ReadOnly)) {
- std::cerr << "Cannot open input file " << QDir::toNativeSeparators(file.fileName()).toStdString()
- << ':' << file.errorString().toStdString() << std::endl;
- return QVariantList();
- }
- QString code = QString::fromUtf8(file.readAll());
-
QQmlJS::Engine engine;
QQmlJS::Lexer lexer(&engine);
lexer.setCode(code, /*line = */ 1);
@@ -212,12 +225,25 @@ QVariantList findQmlImportsInQmlFile(const QString &filePath)
if (!parser.parse() || !parser.diagnosticMessages().isEmpty()) {
// Extract errors from the parser
foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) {
- std::cerr << QDir::toNativeSeparators(file.fileName()).toStdString() << ':'
+ std::cerr << QDir::toNativeSeparators(filePath).toStdString() << ':'
<< m.loc.startLine << ':' << m.message.toStdString() << std::endl;
}
return QVariantList();
}
- return findImportsInAst(parser.ast()->headers, code, file.fileName());
+ return findImportsInAst(parser.ast()->headers, code, filePath);
+}
+
+// Scan a single qml file for import statements
+static QVariantList findQmlImportsInQmlFile(const QString &filePath)
+{
+ QFile file(filePath);
+ if (!file.open(QIODevice::ReadOnly)) {
+ std::cerr << "Cannot open input file " << QDir::toNativeSeparators(file.fileName()).toStdString()
+ << ':' << file.errorString().toStdString() << std::endl;
+ return QVariantList();
+ }
+ QString code = QString::fromUtf8(file.readAll());
+ return findQmlImportsInQmlCode(filePath, code);
}
// Scan a single javascrupt file for import statements
@@ -272,10 +298,15 @@ QVariantList findQmlImportsInJavascriptFile(const QString &filePath)
QVariantList findQmlImportsInFile(const QString &filePath)
{
QVariantList imports;
- if (filePath.endsWith(QStringLiteral(".qml")))
- imports = findQmlImportsInQmlFile(filePath);
- else if (filePath.endsWith(QStringLiteral(".js")))
+ if (filePath == QLatin1String("-")) {
+ QFile f;
+ if (f.open(stdin, QIODevice::ReadOnly))
+ imports = findQmlImportsInQmlCode(QLatin1String("<stdin>"), QString::fromUtf8(f.readAll()));
+ } else if (filePath.endsWith(QStringLiteral(".qml"))) {
+ imports = findQmlImportsInQmlFile(filePath);
+ } else if (filePath.endsWith(QStringLiteral(".js"))) {
imports = findQmlImportsInJavascriptFile(filePath);
+ }
return findPathsForModuleImports(imports);
}
@@ -390,7 +421,7 @@ int main(int argc, char *argv[])
const QString &arg = args.at(i);
++i;
QStringList *argReceiver = 0;
- if (!arg.startsWith(QLatin1Char('-'))) {
+ if (!arg.startsWith(QLatin1Char('-')) || arg == QLatin1String("-")) {
qmlRootPaths += arg;
} else if (arg == QLatin1String("-rootPath")) {
if (i >= args.count())
@@ -415,7 +446,7 @@ int main(int argc, char *argv[])
while (i < args.count()) {
const QString arg = args.at(i);
- if (arg.startsWith(QLatin1Char('-')))
+ if (arg.startsWith(QLatin1Char('-')) && arg != QLatin1String("-"))
break;
++i;
*argReceiver += arg;