diff options
author | Ulf Hermann <[email protected]> | 2023-02-03 11:26:27 +0100 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2023-02-07 19:23:12 +0100 |
commit | 577e1dea2583d6c9dddd122842a2a58be332dbb0 (patch) | |
tree | 70a6d6bc80991e5a9b0d86b4d8cdde93a4f7b59a | |
parent | be815997238f38d6a0672c1cb9f2ecb995ce1d13 (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]>
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> |