diff options
author | Ulf Hermann <[email protected]> | 2025-04-30 09:48:08 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2025-04-30 14:34:17 +0200 |
commit | 06cd8c98435c5c778882eb6f1f32e5740bda59e6 (patch) | |
tree | 13cd2d3fc7912866d1d3597cebb084dc6aff1c6a | |
parent | 5f3b613b2ea848dfc66c00a6d91d507703a916b3 (diff) |
QtQml: Do not check revisions when resolving aliases
Revisions are for unqualified lookup. Aliases are always qualified.
[ChangeLog][QtQml] You can now create aliases to revisioned properties
that would be unavailable when accessed without qualification. Aliases
are always qualified after all.
Pick-to: 6.9
Task-number: QTBUG-136248
Change-Id: I2aae7bb104850def8f220bfab1a2fa056efe78e0
Reviewed-by: Fabian Kosmale <[email protected]>
-rw-r--r-- | src/qml/qml/qqmltypecompiler.cpp | 3 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/aliasToLargeRevision.qml | 9 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.cpp | 3 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.h | 26 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 17 |
5 files changed, 57 insertions, 1 deletions
diff --git a/src/qml/qml/qqmltypecompiler.cpp b/src/qml/qml/qqmltypecompiler.cpp index 0938d14038..842b63b12d 100644 --- a/src/qml/qml/qqmltypecompiler.cpp +++ b/src/qml/qml/qqmltypecompiler.cpp @@ -889,7 +889,8 @@ QQmlComponentAndAliasResolver<QQmlTypeCompiler>::resolveAliasesInObject( QQmlPropertyResolver resolver(targetCache); - const QQmlPropertyData *targetProperty = resolver.property(property.toString()); + const QQmlPropertyData *targetProperty = resolver.property( + property.toString(), nullptr, QQmlPropertyResolver::IgnoreRevision); // If it's an alias that we haven't resolved yet, try again later. if (!targetProperty) { diff --git a/tests/auto/qml/qqmllanguage/data/aliasToLargeRevision.qml b/tests/auto/qml/qqmllanguage/data/aliasToLargeRevision.qml new file mode 100644 index 0000000000..fb74095384 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/aliasToLargeRevision.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +LargeRevision { + id: self + property alias aa: self.a + property alias bb: self.b + property alias cc: self.c + property alias dd: self.d +} diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp index 19477d14a3..bdeee87ba7 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.cpp +++ b/tests/auto/qml/qqmllanguage/testtypes.cpp @@ -199,6 +199,9 @@ void registerTypes() qmlRegisterSingletonType<ReadCounter>("Test", 1, 0, "ReadCounterSingleton", readCounterSingleton); qmlRegisterTypesAndRevisions<BindablePoint>("Test", 1); + + qmlRegisterTypesAndRevisions<LargeRevisionBase>("Test", 1); + qmlRegisterTypesAndRevisions<LargeRevision>("Test", 1); } QVariant myCustomVariantTypeConverter(const QString &data) diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h index ea7dcd539c..52c8d94c4d 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.h +++ b/tests/auto/qml/qqmllanguage/testtypes.h @@ -3276,4 +3276,30 @@ private: QProperty<QPointF> m_point; }; +class LargeRevisionBase : public QObject +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(int c MEMBER m_c CONSTANT) + Q_PROPERTY(int d MEMBER m_d CONSTANT) +public: + int m_c = 11; + int m_d = 12; +}; + +class LargeRevision : public LargeRevisionBase +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(int a MEMBER m_a CONSTANT REVISION(1, 12)) + Q_PROPERTY(int b MEMBER m_b CONSTANT REVISION(12, 12)) + Q_PROPERTY(int c MEMBER m_c CONSTANT REVISION(1, 12)) + Q_PROPERTY(int d MEMBER m_d CONSTANT REVISION(12, 12)) +public: + int m_a = 13; + int m_b = 14; + int m_c = 15; + int m_d = 16; +}; + #endif // TESTTYPES_H diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index f460dc3cad..d95f25df98 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -517,6 +517,8 @@ private slots: void argumentsUsageInBindings_data(); void argumentsUsageInBindings(); + void aliasToLargeRevision(); + private: QQmlEngine engine; QStringList defaultImportPathList; @@ -9767,6 +9769,21 @@ void tst_qqmllanguage::argumentsUsageInBindings() { QCOMPARE(object->property("result").toString(), object->property("expected").toString()); } +void tst_qqmllanguage::aliasToLargeRevision() +{ + QQmlEngine engine; + QQmlComponent c(&engine, testFileUrl("aliasToLargeRevision.qml")); + + QVERIFY2(c.isReady(), qPrintable(c.errorString())); + QScopedPointer<QObject> o(c.create()); + QVERIFY(!o.isNull()); + + QCOMPARE(o->property("aa"), 13); + QCOMPARE(o->property("bb"), 14); + QCOMPARE(o->property("cc"), 15); + QCOMPARE(o->property("dd"), 16); +} + QTEST_MAIN(tst_qqmllanguage) #include "tst_qqmllanguage.moc" |