aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-25 13:29:50 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-25 16:16:21 +0200
commit0cc0c8535b17adc01525b6d309c3e38fd46d7917 (patch)
tree65c6cfb1ded6cfd7befcb60f9f5ffd4e86c0da96
parent5458f379ac5d5d88dd7f5ddeafd370dbeee3a436 (diff)
QQmlDirParser: Treat dependencies like imports
In particular, allow auto and latest versions. Change-Id: I4a6b26112950d066ae2d8a37dc0e9fa1dec24724 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qml/qmldirparser/qqmldirparser.cpp35
-rw-r--r--src/qml/qmldirparser/qqmldirparser_p.h4
-rw-r--r--tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp19
-rw-r--r--tools/qmlimportscanner/main.cpp2
-rw-r--r--tools/qmllint/findwarnings.cpp4
-rw-r--r--tools/qmllint/findwarnings.h2
6 files changed, 38 insertions, 28 deletions
diff --git a/src/qml/qmldirparser/qqmldirparser.cpp b/src/qml/qmldirparser/qqmldirparser.cpp
index e774f471cb..c4fdd70c56 100644
--- a/src/qml/qmldirparser/qqmldirparser.cpp
+++ b/src/qml/qmldirparser/qqmldirparser.cpp
@@ -260,31 +260,18 @@ bool QQmlDirParser::parse(const QString &source)
reportError(lineNumber, 0, QStringLiteral("designersupported does not expect any argument"));
else
_designerSupported = true;
- } else if (sections[0] == QLatin1String("depends")) {
- if (sectionCount != 3) {
- reportError(lineNumber, 0,
- QStringLiteral("depends requires 2 arguments, but %1 were provided").arg(sectionCount - 1));
- continue;
- }
-
- const QTypeRevision version = parseVersion(sections[2]);
- if (version.isValid()) {
- Component entry(sections[1], QString(), version);
- entry.internal = true;
- _dependencies.insert(entry.typeName, entry);
- } else {
- reportError(lineNumber, 0, QStringLiteral("invalid version %1, expected <major>.<minor>").arg(sections[2]));
- }
- } else if (sections[0] == QLatin1String("import")) {
+ } else if (sections[0] == QLatin1String("import")
+ || sections[0] == QLatin1String("depends")) {
+ Import import;
if (sectionCount == 2) {
- _imports << Import(sections[1], QTypeRevision(), false);
+ import = Import(sections[1], QTypeRevision(), false);
} else if (sectionCount == 3) {
if (sections[2] == QLatin1String("auto")) {
- _imports << Import(sections[1], QTypeRevision(), true);
+ import = Import(sections[1], QTypeRevision(), true);
} else {
const auto version = parseVersion(sections[2]);
if (version.isValid()) {
- _imports << Import(sections[1], version, false);
+ import = Import(sections[1], version, false);
} else {
reportError(lineNumber, 0,
QStringLiteral("invalid version %1, expected <major>.<minor>")
@@ -294,10 +281,14 @@ bool QQmlDirParser::parse(const QString &source)
}
} else {
reportError(lineNumber, 0,
- QStringLiteral("import requires 1 or 2 arguments, but %1 were provided")
- .arg(sectionCount - 1));
+ QStringLiteral("%1 requires 1 or 2 arguments, but %2 were provided")
+ .arg(sections[0]).arg(sectionCount - 1));
continue;
}
+ if (sections[0] == QStringLiteral("import"))
+ _imports.append(import);
+ else
+ _dependencies.append(import);
} else if (sectionCount == 2) {
// No version specified (should only be used for relative qmldir files)
const Component entry(sections[0], sections[1], QTypeRevision());
@@ -385,7 +376,7 @@ QMultiHash<QString, QQmlDirParser::Component> QQmlDirParser::components() const
return _components;
}
-QHash<QString, QQmlDirParser::Component> QQmlDirParser::dependencies() const
+QList<QQmlDirParser::Import> QQmlDirParser::dependencies() const
{
return _dependencies;
}
diff --git a/src/qml/qmldirparser/qqmldirparser_p.h b/src/qml/qmldirparser/qqmldirparser_p.h
index 1500d0c653..d65b7eed85 100644
--- a/src/qml/qmldirparser/qqmldirparser_p.h
+++ b/src/qml/qmldirparser/qqmldirparser_p.h
@@ -144,7 +144,7 @@ public:
};
QMultiHash<QString,Component> components() const;
- QHash<QString,Component> dependencies() const;
+ QList<Import> dependencies() const;
QList<Import> imports() const;
QList<Script> scripts() const;
QList<Plugin> plugins() const;
@@ -171,7 +171,7 @@ private:
QList<QQmlJS::DiagnosticMessage> _errors;
QString _typeNamespace;
QMultiHash<QString,Component> _components;
- QHash<QString,Component> _dependencies;
+ QList<Import> _dependencies;
QList<Import> _imports;
QList<Script> _scripts;
QList<Plugin> _plugins;
diff --git a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
index d019285c5b..d53de4fd52 100644
--- a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
+++ b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
@@ -99,6 +99,14 @@ namespace {
+ QLatin1Char('|') + (c.internal ? "true" : "false");
}
+ QString toString(const QQmlDirParser::Import &i)
+ {
+ return i.module + QLatin1String("||")
+ + QString::number(i.version.majorVersion()) + QLatin1Char('|')
+ + QString::number(i.version.minorVersion())
+ + QLatin1String("|true");
+ }
+
QStringList toStringList(const QQmlDirComponents &components)
{
QStringList rv;
@@ -110,6 +118,17 @@ namespace {
return rv;
}
+ QStringList toStringList(const QQmlDirImports &components)
+ {
+ QStringList rv;
+
+ foreach (const QQmlDirParser::Import &c, components)
+ rv.append(toString(c));
+
+ std::sort(rv.begin(), rv.end());
+ return rv;
+ }
+
QString toString(const QQmlDirParser::Script &s)
{
return s.nameSpace + QLatin1Char('|') + s.fileName + QLatin1Char('|')
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp
index 91c37a620f..f296cc7101 100644
--- a/tools/qmlimportscanner/main.cpp
+++ b/tools/qmlimportscanner/main.cpp
@@ -188,7 +188,7 @@ QVariantMap pluginsForModulePath(const QString &modulePath, const QString &versi
QStringList importsAndDependencies;
const auto dependencies = parser.dependencies();
for (const auto &dependency : dependencies)
- importsAndDependencies.append(dependency.typeName + versionSuffix(dependency.version));
+ importsAndDependencies.append(dependency.module + versionSuffix(dependency.version));
const auto imports = parser.imports();
for (const auto &import : imports) {
diff --git a/tools/qmllint/findwarnings.cpp b/tools/qmllint/findwarnings.cpp
index 3caf72633a..997b8eda3a 100644
--- a/tools/qmllint/findwarnings.cpp
+++ b/tools/qmllint/findwarnings.cpp
@@ -100,7 +100,7 @@ FindWarningVisitor::Importer::Import FindWarningVisitor::Importer::readQmldir(co
Import result;
auto reader = createQmldirParserForFile(path + SlashQmldir);
result.imports.append(reader.imports());
- result.dependencies.append(reader.dependencies().values());
+ result.dependencies.append(reader.dependencies());
QHash<QString, ScopeTree::Ptr> qmlComponents;
const auto components = reader.components();
@@ -143,7 +143,7 @@ void FindWarningVisitor::Importer::processImport(
// QML code but the C++ types will be visible.
const QString invalidPrefix = QString::fromLatin1("$dependency$");
for (auto const &dependency : qAsConst(import.dependencies))
- importHelper(dependency.typeName, invalidPrefix, dependency.version);
+ importHelper(dependency.module, invalidPrefix, dependency.version);
for (auto const &import : qAsConst(import.imports)) {
importHelper(import.module, prefix,
diff --git a/tools/qmllint/findwarnings.h b/tools/qmllint/findwarnings.h
index edc4d46272..f16cff595c 100644
--- a/tools/qmllint/findwarnings.h
+++ b/tools/qmllint/findwarnings.h
@@ -84,7 +84,7 @@ private:
struct Import {
QHash<QString, ScopeTree::Ptr> objects;
QList<QQmlDirParser::Import> imports;
- QList<QQmlDirParser::Component> dependencies;
+ QList<QQmlDirParser::Import> dependencies;
QList<QPair<QString, ScopeTree::Ptr>> scripts;
};