[new compiler] Fix implicit component determination inside group properties
authorSimon Hausmann <simon.hausmann@digia.com>
Wed, 26 Feb 2014 09:53:02 +0000 (10:53 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sun, 2 Mar 2014 13:48:59 +0000 (14:48 +0100)
Don't only scan full-typed objects for property bindings that may define
components implicitly, do this for any types we know (propertyCache populated)
and that aren't explicitly of Component type.

Change-Id: I918b636be6d524e919cdd4efd49c33e63da64de3
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/compiler/qqmltypecompiler.cpp
src/qml/compiler/qqmltypecompiler_p.h
tests/auto/qml/qqmllanguage/data/autoComponentCreationInGroupProperties.qml [new file with mode: 0644]
tests/auto/qml/qqmllanguage/testtypes.h
tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp

index a1085b1..2165f3d 100644 (file)
@@ -1040,12 +1040,8 @@ QQmlComponentAndAliasResolver::QQmlComponentAndAliasResolver(QQmlTypeCompiler *t
 {
 }
 
-void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQml::QmlObject *obj, int objectIndex)
+void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQml::QmlObject *obj, QQmlPropertyCache *propertyCache)
 {
-    QQmlPropertyCache *propertyCache = propertyCaches.value(objectIndex);
-    if (!propertyCache)
-        return;
-
     PropertyResolver propertyResolver(propertyCache);
 
     QQmlPropertyData *defaultProperty = obj->indexOfDefaultProperty != -1 ? propertyCache->parent()->defaultProperty() : propertyCache->defaultProperty();
@@ -1124,13 +1120,20 @@ bool QQmlComponentAndAliasResolver::resolve()
     const int objCountWithoutSynthesizedComponents = qmlObjects->count();
     for (int i = 0; i < objCountWithoutSynthesizedComponents; ++i) {
         const QtQml::QmlObject *obj = qmlObjects->at(i);
-        if (obj->inheritedTypeNameIndex == 0)
+        QQmlPropertyCache *cache = propertyCaches.value(i);
+        if (obj->inheritedTypeNameIndex == 0 && !cache)
             continue;
 
-        QQmlCompiledData::TypeReference *tref = resolvedTypes->value(obj->inheritedTypeNameIndex);
-        Q_ASSERT(tref);
-        if (!tref->type || tref->type->metaObject() != &QQmlComponent::staticMetaObject) {
-            findAndRegisterImplicitComponents(obj, i);
+        bool isExplicitComponent = false;
+
+        if (obj->inheritedTypeNameIndex) {
+            QQmlCompiledData::TypeReference *tref = resolvedTypes->value(obj->inheritedTypeNameIndex);
+            Q_ASSERT(tref);
+            if (tref->type && tref->type->metaObject() == &QQmlComponent::staticMetaObject)
+                isExplicitComponent = true;
+        }
+        if (!isExplicitComponent) {
+            findAndRegisterImplicitComponents(obj, cache);
             continue;
         }
 
index 71ae77a..6c4532d 100644 (file)
@@ -183,7 +183,7 @@ public:
     bool resolve();
 
 protected:
-    void findAndRegisterImplicitComponents(const QtQml::QmlObject *obj, int objectIndex);
+    void findAndRegisterImplicitComponents(const QtQml::QmlObject *obj, QQmlPropertyCache *propertyCache);
     bool collectIdsAndAliases(int objectIndex);
     bool resolveAliases();
 
diff --git a/tests/auto/qml/qqmllanguage/data/autoComponentCreationInGroupProperties.qml b/tests/auto/qml/qqmllanguage/data/autoComponentCreationInGroupProperties.qml
new file mode 100644 (file)
index 0000000..6dae861
--- /dev/null
@@ -0,0 +1,6 @@
+import Test 1.0
+MyTypeObject {
+    selfGroupProperty {
+        componentProperty : MyTypeObject { realProperty: 9 }
+    }
+}
index 27ad340..5086180 100644 (file)
@@ -256,6 +256,8 @@ class MyTypeObject : public QObject
     Q_PROPERTY(MyGroupedObject *grouped READ grouped CONSTANT)
     Q_PROPERTY(MyGroupedObject *nullGrouped READ nullGrouped CONSTANT)
 
+    Q_PROPERTY(MyTypeObject *selfGroupProperty READ selfGroupProperty)
+
 public:
     MyTypeObject()
         : objectPropertyValue(0), componentPropertyValue(0) {}
@@ -550,6 +552,8 @@ public:
 
     MyGroupedObject *nullGrouped() { return 0; }
 
+    MyTypeObject *selfGroupProperty() { return this; }
+
     void doAction() { emit action(); }
 signals:
     void action();
index 826bd12..07644be 100644 (file)
@@ -117,6 +117,7 @@ private slots:
     void dynamicSignalsAndSlots();
     void simpleBindings();
     void autoComponentCreation();
+    void autoComponentCreationInGroupProperty();
     void propertyValueSource();
     void attachedProperties();
     void dynamicObjects();
@@ -1351,6 +1352,18 @@ void tst_qqmllanguage::autoComponentCreation()
     QCOMPARE(child->realProperty(), qreal(9));
 }
 
+void tst_qqmllanguage::autoComponentCreationInGroupProperty()
+{
+    QQmlComponent component(&engine, testFileUrl("autoComponentCreationInGroupProperties.qml"));
+    VERIFY_ERRORS(0);
+    MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
+    QVERIFY(object != 0);
+    QVERIFY(object->componentProperty() != 0);
+    MyTypeObject *child = qobject_cast<MyTypeObject *>(object->componentProperty()->create());
+    QVERIFY(child != 0);
+    QCOMPARE(child->realProperty(), qreal(9));
+}
+
 void tst_qqmllanguage::propertyValueSource()
 {
     {