aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <[email protected]>2023-02-03 11:26:27 +0100
committerUlf Hermann <[email protected]>2023-02-07 19:23:12 +0100
commit577e1dea2583d6c9dddd122842a2a58be332dbb0 (patch)
tree70a6d6bc80991e5a9b0d86b4d8cdde93a4f7b59a
parentbe815997238f38d6a0672c1cb9f2ecb995ce1d13 (diff)
qmldir parser: Handle internal types with versions
There is no reason why internal types cannot have versions. Pick-to: 6.5 Task-number: QTBUG-110815 Change-Id: I7fa9790dc64dd785fc08ec7b22f68b4f961fdb00 Reviewed-by: Fabian Kosmale <[email protected]>
-rw-r--r--src/qml/qmldirparser/qqmldirparser.cpp24
-rw-r--r--tests/auto/qml/qqmldirparser/data/versioned-internal/qmldir3
-rw-r--r--tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp11
-rw-r--r--tests/auto/qml/qqmlmoduleplugin/data/implicit2/implicitQmldir.2.errors.txt2
4 files changed, 34 insertions, 6 deletions
diff --git a/src/qml/qmldirparser/qqmldirparser.cpp b/src/qml/qmldirparser/qqmldirparser.cpp
index 112c7d12d0..9a34c9fe49 100644
--- a/src/qml/qmldirparser/qqmldirparser.cpp
+++ b/src/qml/qmldirparser/qqmldirparser.cpp
@@ -233,14 +233,28 @@ bool QQmlDirParser::parse(const QString &source)
_classNames.append(sections[1]);
} else if (sections[0] == QLatin1String("internal")) {
- if (sectionCount != 3) {
+ if (sectionCount == 3) {
+ Component entry(sections[1], sections[2], QTypeRevision());
+ entry.internal = true;
+ _components.insert(entry.typeName, entry);
+ } else if (sectionCount == 4) {
+ const QTypeRevision version = parseVersion(sections[2]);
+ if (version.isValid()) {
+ Component entry(sections[1], sections[3], version);
+ entry.internal = true;
+ _components.insert(entry.typeName, entry);
+ } else {
+ reportError(lineNumber, 0,
+ QStringLiteral("invalid version %1, expected <major>.<minor>")
+ .arg(sections[2]));
+ continue;
+ }
+ } else {
reportError(lineNumber, 0,
- QStringLiteral("internal types require 2 arguments, but %1 were provided").arg(sectionCount - 1));
+ QStringLiteral("internal types require 2 or 3 arguments, "
+ "but %1 were provided").arg(sectionCount - 1));
continue;
}
- Component entry(sections[1], sections[2], QTypeRevision());
- entry.internal = true;
- _components.insert(entry.typeName, entry);
} else if (sections[0] == QLatin1String("singleton")) {
if (sectionCount < 3 || sectionCount > 4) {
reportError(lineNumber, 0,
diff --git a/tests/auto/qml/qqmldirparser/data/versioned-internal/qmldir b/tests/auto/qml/qqmldirparser/data/versioned-internal/qmldir
new file mode 100644
index 0000000000..3a3e606099
--- /dev/null
+++ b/tests/auto/qml/qqmldirparser/data/versioned-internal/qmldir
@@ -0,0 +1,3 @@
+module MyModule
+internal InternalType 1.0 InternalType.qml
+
diff --git a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
index 55b776c6a2..fa119136ff 100644
--- a/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
+++ b/tests/auto/qml/qqmldirparser/tst_qqmldirparser.cpp
@@ -421,6 +421,17 @@ void tst_qqmldirparser::parse_data()
<< QStringList()
<< QStringList()
<< false;
+
+ QTest::newRow("versioned-internal")
+ << "versioned-internal/qmldir"
+ << QString()
+ << QStringList()
+ << QStringList()
+ << QStringList()
+ << QStringList({"InternalType|InternalType.qml|1|0|true"})
+ << QStringList()
+ << QStringList()
+ << false;
}
void tst_qqmldirparser::parse()
diff --git a/tests/auto/qml/qqmlmoduleplugin/data/implicit2/implicitQmldir.2.errors.txt b/tests/auto/qml/qqmlmoduleplugin/data/implicit2/implicitQmldir.2.errors.txt
index ee68ebdfe0..56373ba3f4 100644
--- a/tests/auto/qml/qqmlmoduleplugin/data/implicit2/implicitQmldir.2.errors.txt
+++ b/tests/auto/qml/qqmlmoduleplugin/data/implicit2/implicitQmldir.2.errors.txt
@@ -1,2 +1,2 @@
1:-1:a component declaration requires two or three arguments, but 4 were provided
-2:-1:internal types require 2 arguments, but 3 were provided
+2:-1:invalid version bar, expected <major>.<minor>