diff options
-rw-r--r-- | tools/qmlimportscanner/main.cpp | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp index d3c5c638e9..9ad315016f 100644 --- a/tools/qmlimportscanner/main.cpp +++ b/tools/qmlimportscanner/main.cpp @@ -43,7 +43,9 @@ #include <private/qqmljsparser_p.h> #include <private/qqmljsast_p.h> #include <private/qv4codegen_p.h> +#include <private/qv4value_inl_p.h> #include <private/qqmlpool_p.h> +#include <private/qqmlirbuilder_p.h> #include <QtCore/QCoreApplication> #include <QtCore/QDir> @@ -238,38 +240,38 @@ QVariantList findQmlImportsInJavascriptFile(const QString &filePath) QVariantList imports; - // look for ".import Foo.Bar 2.0 as FooBar" lines - do { - QByteArray rawLine = file.readLine(); - QByteArray line = rawLine.simplified(); - if (line.simplified().startsWith(".import")) { - QList<QByteArray> parts = line.split(' '); - - if (parts.count() < 2) - continue; - - QVariantMap import; - QByteArray name = parts.at(1); - QByteArray version = parts.at(2); - - // handle import cases: .js file, diriectory (check for precense of "/"), - // and module (the most common case) - if (name.contains(".js")) { - import[QStringLiteral("type")] = QStringLiteral("javascript"); - import[QStringLiteral("path")] = name; - } else if (name.contains("/")) { - import[QStringLiteral("type")] = QStringLiteral("directory"); - import[QStringLiteral("path")] = name; + QString sourceCode = QString::fromUtf8(file.readAll()); + file.close(); + QmlIR::Document doc(/*debug mode*/false); + QQmlJS::DiagnosticMessage error; + doc.extractScriptMetaData(sourceCode, &error); + if (!error.message.isEmpty()) + return imports; + + foreach (const QV4::CompiledData::Import *import, doc.imports) { + QVariantMap entry; + const QString name = doc.stringAt(import->uriIndex); + switch (import->type) { + case QV4::CompiledData::Import::ImportScript: + entry[QStringLiteral("type")] = QStringLiteral("javascript"); + entry[QStringLiteral("path")] = name; + break; + case QV4::CompiledData::Import::ImportLibrary: + if (name.contains(QLatin1Char('/'))) { + entry[QStringLiteral("type")] = QStringLiteral("directory"); + entry[QStringLiteral("name")] = name; } else { - import[QStringLiteral("type")] = QStringLiteral("module"); - import[QStringLiteral("name")] = name; - import[QStringLiteral("version")] = version; + entry[QStringLiteral("type")] = QStringLiteral("module"); + entry[QStringLiteral("name")] = name; + entry[QStringLiteral("version")] = QString::number(import->majorVersion) + QLatin1Char('.') + QString::number(import->minorVersion); } - - imports.append(import); + break; + default: + Q_UNREACHABLE(); + continue; } + imports << entry; } - while (file.canReadLine()); return imports; } |