diff options
author | Aleix Pol <aleixpol@kde.org> | 2019-07-20 13:46:36 +0200 |
---|---|---|
committer | Aleix Pol <aleixpol@kde.org> | 2019-08-23 12:40:15 +0200 |
commit | 7919751e999d68d4b4e9dae37493d607e7759105 (patch) | |
tree | cec401f0dc06931933e4323c6aac8279a103ef8d | |
parent | c40d368f7328c1706ff128d2fb362f5935083c1b (diff) |
Improve error message when setting to a property with unknown type
At the moment we were being told that the types were incompatible but
the truth was we were comparing to nullptr.
This patch makes it apparent that the assigning broke because the type
comparison never happened.
Change-Id: I29728eedeee13c3bc9389213735df142f56e9c34
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/qml/qml/qqmlpropertyvalidator.cpp | 18 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/propertyUnknownType.errors.txt | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/propertyUnknownType.qml | 4 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.cpp | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.h | 13 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 3 |
6 files changed, 32 insertions, 8 deletions
diff --git a/src/qml/qml/qqmlpropertyvalidator.cpp b/src/qml/qml/qqmlpropertyvalidator.cpp index 71964aca64..7dbcbe986b 100644 --- a/src/qml/qml/qqmlpropertyvalidator.cpp +++ b/src/qml/qml/qqmlpropertyvalidator.cpp @@ -711,21 +711,25 @@ QQmlJS::DiagnosticMessage QQmlPropertyValidator::validateObjectBinding(QQmlPrope // Using -1 for the minor version ensures that we get the raw metaObject. QQmlPropertyCache *propertyMetaObject = enginePrivate->rawPropertyCacheForType(property->propType(), -1); - // Will be true if the assigned type inherits propertyMetaObject - bool isAssignable = false; - // Determine isAssignable value if (propertyMetaObject) { + // Will be true if the assigned type inherits propertyMetaObject + // Determine isAssignable value + bool isAssignable = false; QQmlPropertyCache *c = propertyCaches.at(binding->value.objectIndex); while (c && !isAssignable) { isAssignable |= c == propertyMetaObject; c = c->parent(); } - } - if (!isAssignable) { - return qQmlCompileError(binding->valueLocation, tr("Cannot assign object of type \"%1\" to property of type \"%2\" as the former is neither the same as the latter nor a sub-class of it.") - .arg(stringAt(compilationUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex)).arg(QLatin1String(QMetaType::typeName(property->propType())))); + if (!isAssignable) { + return qQmlCompileError(binding->valueLocation, tr("Cannot assign object of type \"%1\" to property of type \"%2\" as the former is neither the same as the latter nor a sub-class of it.") + .arg(stringAt(compilationUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex)).arg(QLatin1String(QMetaType::typeName(property->propType())))); + } + } else { + return qQmlCompileError(binding->valueLocation, tr("Cannot assign to property of unknown type \"%1\".") + .arg(QLatin1String(QMetaType::typeName(property->propType())))); } + } return noError; } diff --git a/tests/auto/qml/qqmllanguage/data/propertyUnknownType.errors.txt b/tests/auto/qml/qqmllanguage/data/propertyUnknownType.errors.txt new file mode 100644 index 0000000000..1655f9264a --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/propertyUnknownType.errors.txt @@ -0,0 +1 @@ +3:23:Cannot assign to property of unknown type "SomethingUnknown*". diff --git a/tests/auto/qml/qqmllanguage/data/propertyUnknownType.qml b/tests/auto/qml/qqmllanguage/data/propertyUnknownType.qml new file mode 100644 index 0000000000..c22fd65350 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/propertyUnknownType.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + somethingUnknown: SomethingKnown {} +} diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp index ffb1d51971..6956533196 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.cpp +++ b/tests/auto/qml/qqmllanguage/testtypes.cpp @@ -62,6 +62,7 @@ void registerTypes() qmlRegisterType<MyRevisionedClass,1>("Test",1,1,"MyRevisionedClass"); qmlRegisterType<MyRevisionedIllegalOverload>("Test",1,0,"MyRevisionedIllegalOverload"); qmlRegisterType<MyRevisionedLegalOverload>("Test",1,0,"MyRevisionedLegalOverload"); + qmlRegisterType<SomethingKnown>("Test",1,0,"SomethingKnown"); // Register the uncreatable base class qmlRegisterRevision<MyRevisionedBaseClassRegistered,1>("Test",1,1); diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h index 0618d2b20f..1aab24841a 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.h +++ b/tests/auto/qml/qqmllanguage/testtypes.h @@ -89,6 +89,14 @@ private: int m_value2; }; +class SomethingUnknown : public QObject { + Q_OBJECT +}; + +class SomethingKnown : public SomethingUnknown { + Q_OBJECT +}; + class MyQmlObject : public QObject, public MyInterface { Q_OBJECT @@ -104,6 +112,7 @@ class MyQmlObject : public QObject, public MyInterface Q_PROPERTY(int propertyWithNotify READ propertyWithNotify WRITE setPropertyWithNotify NOTIFY oddlyNamedNotifySignal) Q_PROPERTY(int nonScriptable READ nonScriptable WRITE setNonScriptable SCRIPTABLE false) Q_PROPERTY(QJSValue qjsvalue READ qjsvalue WRITE setQJSValue NOTIFY qjsvalueChanged) + Q_PROPERTY(SomethingUnknown* somethingUnknown READ somethingUnknown WRITE setSomethingUnknown NOTIFY somethingUnknownChanged) Q_INTERFACES(MyInterface) public: @@ -151,6 +160,9 @@ public: int childAddedEventCount() const { return m_childAddedEventCount; } + SomethingUnknown* somethingUnknown() const { return nullptr; } + void setSomethingUnknown(SomethingUnknown* something) { Q_UNUSED(something); } + public slots: void basicSlot() { qWarning("MyQmlObject::basicSlot"); } void basicSlotWithArgs(int v) { qWarning("MyQmlObject::basicSlotWithArgs(%d)", v); } @@ -162,6 +174,7 @@ signals: void oddlyNamedNotifySignal(); void signalWithDefaultArg(int parameter = 5); void qjsvalueChanged(); + void somethingUnknownChanged(); protected: virtual bool event(QEvent *event); diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 27b550457d..8adacd8829 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -626,8 +626,9 @@ void tst_qqmllanguage::errors_data() QTest::newRow("bareQmlImport") << "bareQmlImport.qml" << "bareQmlImport.errors.txt" << false; QTest::newRow("typeAnnotations.2") << "typeAnnotations.2.qml" << "typeAnnotations.2.errors.txt" << false; -} + QTest::newRow("propertyUnknownType") << "propertyUnknownType.qml" << "propertyUnknownType.errors.txt" << false; +} void tst_qqmllanguage::errors() { |