diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-12-08 14:12:47 +0100 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2020-12-24 23:20:14 +0100 |
commit | bb0ce1ffd48aa69da03dc43bd314351519ebf0d7 (patch) | |
tree | a603b32e6b6d731852197340c60a05c5c9f87fd5 /src/qml/qml/qqmlpropertyvalidator.cpp | |
parent | 5a7aa7881fa2c7abffb3d34a6b642fe4efcadbf4 (diff) |
Fix IC properties in same file
Also fixes typename and metatype registration for inline components.
Done-with: Fabian Kosmale <fabian.kosmale@qt.io>
Fixes: QTBUG-89173
Change-Id: I97d65d5539b577a8828d5711e5f2e79c8568b441
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit c2ca14ce22551ea72544b6e2b3a19823b6dc3050)
Diffstat (limited to 'src/qml/qml/qqmlpropertyvalidator.cpp')
-rw-r--r-- | src/qml/qml/qqmlpropertyvalidator.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlpropertyvalidator.cpp b/src/qml/qml/qqmlpropertyvalidator.cpp index 3587609301..3a1f33113f 100644 --- a/src/qml/qml/qqmlpropertyvalidator.cpp +++ b/src/qml/qml/qqmlpropertyvalidator.cpp @@ -651,6 +651,19 @@ bool QQmlPropertyValidator::canCoerce(int to, QQmlPropertyCache *fromMo) const { QQmlPropertyCache *toMo = enginePrivate->rawPropertyCacheForType(to); + if (toMo == nullptr) { + // if we have an inline component from the current file, + // it is not properly registered at this point, as registration + // only occurs after the whole file has been validated + // Therefore we need to check the ICs here + for (const auto& icDatum : compilationUnit->inlineComponentData) { + if (icDatum.typeIds.id == to) { + toMo = compilationUnit->propertyCaches.at(icDatum.objectIndex); + break; + } + } + } + while (fromMo) { if (fromMo == toMo) return true; @@ -746,6 +759,18 @@ QQmlError QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData *propert // effect the properties on the type, but don't effect assignability // Using -1 for the minor version ensures that we get the raw metaObject. QQmlPropertyCache *propertyMetaObject = enginePrivate->rawPropertyCacheForType(propType, -1); + if (!propertyMetaObject) { + // if we have an inline component from the current file, + // it is not properly registered at this point, as registration + // only occurs after the whole file has been validated + // Therefore we need to check the ICs here + for (const auto& icDatum: compilationUnit->inlineComponentData) { + if (icDatum.typeIds.id == property->propType()) { + propertyMetaObject = compilationUnit->propertyCaches.at(icDatum.objectIndex); + break; + } + } + } if (propertyMetaObject) { // Will be true if the assigned type inherits propertyMetaObject |