diff options
author | Ulf Hermann <[email protected]> | 2025-04-28 16:05:13 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2025-05-06 20:25:46 +0000 |
commit | 2a1792e9f9697a4b4f15218bf03fbc74eb0cc75d (patch) | |
tree | 850bb4a7d3bb2c04ae1f93ca4970d4d1cdd352b7 | |
parent | 981814fd8d571b12940e3b2a2441fc686fd5bdcb (diff) |
qmltyperegistrar: Do not filter members by revision for qmltypes
We need information about all members in the qmltypes file, even if the
revisions are nonsensical. This is because we need to get the method
indices right when trying to call methods.
We don't want to actually register the extra versions, but the code
handling registration is different from the code producing qmltypes
already.
Amends commit c0f4442ae0d83e63fc90f1d5058081355f83b701
Pick-to: 6.9
Fixes: QTBUG-136248
Change-Id: Ibd41fcd3a3d7b9d79e1d1715746dd90702ade518
Reviewed-by: Sami Shalayel <[email protected]>
Reviewed-by: Fabian Kosmale <[email protected]>
4 files changed, 14 insertions, 48 deletions
diff --git a/src/qmltyperegistrar/qqmltypescreator.cpp b/src/qmltyperegistrar/qqmltypescreator.cpp index fc76e18093..d22f5a1f66 100644 --- a/src/qmltyperegistrar/qqmltypescreator.cpp +++ b/src/qmltyperegistrar/qqmltypescreator.cpp @@ -290,47 +290,10 @@ void QmlTypesCreator::writeEnums(const Enum::Container &enums) } } -template<typename Member> -bool isAllowedInMajorVersion(const Member &memberObject, QTypeRevision maxMajorVersion) -{ - const QTypeRevision memberRevision = memberObject.revision; - return !memberRevision.hasMajorVersion() - || memberRevision.majorVersion() <= maxMajorVersion.majorVersion(); -} - -template<typename Members, typename Postprocess> -Members members(const Members &candidates, QTypeRevision maxMajorVersion, Postprocess &&process) -{ - Members classDefMembers; - - for (const auto &member : candidates) { - if (isAllowedInMajorVersion(member, maxMajorVersion)) - classDefMembers.push_back(process(member)); - } - - return classDefMembers; -} - -template<typename Members> -Members members(const Members &candidates, QTypeRevision maxMajorVersion) -{ - return members(candidates, maxMajorVersion, [](const auto &member) { return member; }); -} - -template<typename Members> -Members constructors(const Members &candidates, QTypeRevision maxMajorVersion) -{ - return members(candidates, maxMajorVersion, [](const auto &member) { - auto ctor = member; - ctor.isConstructor = true; - return ctor; - }); -} - void QmlTypesCreator::writeRootMethods(const MetaType &classDef) { // Hide destroyed() signals - Method::Container componentSignals = members(classDef.sigs(), m_version); + Method::Container componentSignals = classDef.sigs(); for (auto it = componentSignals.begin(); it != componentSignals.end();) { if (it->name == "destroyed"_L1) it = componentSignals.erase(it); @@ -340,7 +303,7 @@ void QmlTypesCreator::writeRootMethods(const MetaType &classDef) writeMethods(componentSignals, S_SIGNAL); // Hide deleteLater() methods - Method::Container componentMethods = members(classDef.methods(), m_version); + Method::Container componentMethods = classDef.methods(); for (auto it = componentMethods.begin(); it != componentMethods.end();) { if (it->name == "deleteLater"_L1) it = componentMethods.erase(it); @@ -387,16 +350,16 @@ void QmlTypesCreator::writeComponent(const QmlTypesClassDescription &collector) if (const MetaType &classDef = collector.resolvedClass; !classDef.isEmpty()) { writeEnums(classDef.enums()); - writeProperties(members(classDef.properties(), m_version)); + writeProperties(classDef.properties()); if (collector.isRootClass) { writeRootMethods(classDef); } else { - writeMethods(members(classDef.sigs(), m_version), S_SIGNAL); - writeMethods(members(classDef.methods(), m_version), S_METHOD); + writeMethods(classDef.sigs(), S_SIGNAL); + writeMethods(classDef.methods(), S_METHOD); } - writeMethods(constructors(classDef.constructors(), m_version), S_METHOD); + writeMethods(classDef.constructors(), S_METHOD); } m_qml.writeEndObject(); } diff --git a/tests/auto/qml/qmltc_qprocess/tst_qmltc_qprocess.cpp b/tests/auto/qml/qmltc_qprocess/tst_qmltc_qprocess.cpp index becc8c602f..d0677dd8a1 100644 --- a/tests/auto/qml/qmltc_qprocess/tst_qmltc_qprocess.cpp +++ b/tests/auto/qml/qmltc_qprocess/tst_qmltc_qprocess.cpp @@ -206,8 +206,11 @@ void tst_qmltc_qprocess::warningsAsErrors() void tst_qmltc_qprocess::invalidAliasRevision() { + // This isn't actually invalid. Revisions are only relevant for unqualified lookup + // but alias expressions are always qualified. const auto errors = runQmltc(u"invalidAliasRevision.qml"_s, false); - QVERIFY(errors.contains(u"Cannot resolve alias \"unexistingProperty\" [unresolved-alias]"_s)); + QVERIFY2(!errors.contains(u"Cannot resolve alias \"unexistingProperty\" [unresolved-alias]"_s), + qPrintable(errors)); } void tst_qmltc_qprocess::topLevelComponent() diff --git a/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.cpp b/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.cpp index f44f14e45a..0bb2c2bd80 100644 --- a/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.cpp +++ b/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.cpp @@ -120,11 +120,11 @@ void tst_qmltyperegistrar::isBindable() QVERIFY(qmltypesData.contains(R"(Property { name: "someProperty"; type: "int"; bindable: "bindableSomeProperty"; index: 0 })")); } -void tst_qmltyperegistrar::restrictToImportVersion() +void tst_qmltyperegistrar::doNotRestrictToImportVersion() { QVERIFY(qmltypesData.contains("ExcessiveVersion")); - QVERIFY(!qmltypesData.contains("1536")); // Q_REVISION(6, 0) - QVERIFY(!qmltypesData.contains("paletteChanged")); // Added in version 6.0 + QVERIFY(qmltypesData.contains("1536")); // Q_REVISION(6, 0) + QVERIFY(qmltypesData.contains("paletteChanged")); // Added in version 6.0 } void tst_qmltyperegistrar::pastMajorVersions() diff --git a/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.h b/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.h index 1d3c30a79d..008af807f0 100644 --- a/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.h +++ b/tests/auto/qml/qmltyperegistrar/tst_qmltyperegistrar.h @@ -932,7 +932,7 @@ private slots: void superAndForeignTypes(); void accessSemantics(); void isBindable(); - void restrictToImportVersion(); + void doNotRestrictToImportVersion(); void pastMajorVersions(); void implementsInterfaces(); void namespacedElement(); |