Allow static alias to composite type
authorAaron Kennedy <aaron.kennedy@nokia.com>
Mon, 25 Jul 2011 03:52:49 +0000 (13:52 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 25 Jul 2011 04:08:56 +0000 (06:08 +0200)
Task-number: QTBUG-20200

Change-Id: I2a118dfc9ce1956e038f70049c905ec38396fe5e
Reviewed-on: http://codereview.qt.nokia.com/2062
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/qdeclarativecompiler.cpp
tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType1.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType2.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/data/aliasToCompositeElement.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp

index 581a538..0f0acba 100644 (file)
@@ -2774,21 +2774,13 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
         else
             typeName = aliasProperty.typeName();
     } else {
-        typeName = idObject->metaObject()->className();
+        Q_ASSERT(idObject->type != -1); // How else did it get an id?
 
-        //use the base type since it has been registered with metatype system
-        int index = typeName.indexOf("_QML_");
-        if (index != -1) {
-            typeName = typeName.left(index);
-        } else {
-            index = typeName.indexOf("_QMLTYPE_");
-            const QMetaObject *mo = idObject->metaObject();
-            while (index != -1 && mo) {
-                typeName = mo->superClass()->className();
-                index = typeName.indexOf("_QMLTYPE_");
-                mo = mo->superClass();
-            }
-        }
+        const QDeclarativeCompiledData::TypeReference &ref = output->types.at(idObject->type);
+        if (ref.type)
+            typeName = ref.type->typeName();
+        else
+            typeName = ref.component->root->className();
 
         typeName += '*';
     }
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType1.qml
new file mode 100644 (file)
index 0000000..723b9c3
--- /dev/null
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+QtObject {
+    property alias group: obj
+    property variant foo: AliasToCompositeElementType2 { id: obj }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasToCompositeElementType2.qml
new file mode 100644 (file)
index 0000000..4127ca4
--- /dev/null
@@ -0,0 +1,5 @@
+import QtQuick 1.0
+
+QtObject {
+    property int value
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasToCompositeElement.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasToCompositeElement.qml
new file mode 100644 (file)
index 0000000..612c599
--- /dev/null
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+AliasToCompositeElementType1 {
+    group.value: 13
+}
+
index d73da28..2b02ad2 100644 (file)
@@ -182,6 +182,7 @@ private slots:
     void aliasBindingsAssignCorrectly();
     void aliasBindingsOverrideTarget();
     void aliasWritesOverrideBindings();
+    void aliasToCompositeElement();
     void realToInt();
 
     void include();
@@ -3526,6 +3527,18 @@ void tst_qdeclarativeecmascript::aliasWritesOverrideBindings()
     }
 }
 
+// Allow an alais to a composite element
+// QTBUG-20200
+void tst_qdeclarativeecmascript::aliasToCompositeElement()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("aliasToCompositeElement.qml"));
+
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+
+    delete object;
+}
+
 void tst_qdeclarativeecmascript::revisionErrors()
 {
     {