[new compiler] Fix customer parser use with nested objects
authorSimon Hausmann <simon.hausmann@digia.com>
Thu, 16 Jan 2014 13:51:33 +0000 (14:51 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 20 Jan 2014 10:49:39 +0000 (11:49 +0100)
Types with a custom parser attached don't need to continue with validation of
properties in sub-objects.

Change-Id: Ib25f8e037cf651dfb30dd4016f89980612dff4f4
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/compiler/qqmltypecompiler.cpp
src/qml/compiler/qqmltypecompiler_p.h

index a4301fd..91f5535 100644 (file)
@@ -1104,21 +1104,7 @@ QQmlPropertyValidator::QQmlPropertyValidator(QQmlTypeCompiler *typeCompiler)
 
 bool QQmlPropertyValidator::validate()
 {
-    for (quint32 i = 0; i < qmlUnit->nObjects; ++i) {
-        const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i);
-        if (stringAt(obj->inheritedTypeNameIndex).isEmpty())
-            continue;
-
-        if (isComponent(i))
-            continue;
-
-        QQmlPropertyCache *propertyCache = propertyCaches.value(i);
-        Q_ASSERT(propertyCache);
-
-        if (!validateObject(obj, i, propertyCache))
-            return false;
-    }
-    return true;
+    return validateObject(qmlUnit->indexOfRootObject);
 }
 
 const QQmlImports &QQmlPropertyValidator::imports() const
@@ -1126,8 +1112,18 @@ const QQmlImports &QQmlPropertyValidator::imports() const
     return *compiler->imports();
 }
 
-bool QQmlPropertyValidator::validateObject(const QV4::CompiledData::Object *obj, int objectIndex, QQmlPropertyCache *propertyCache)
+bool QQmlPropertyValidator::validateObject(int objectIndex)
 {
+    const QV4::CompiledData::Object *obj = qmlUnit->objectAt(objectIndex);
+    if (stringAt(obj->inheritedTypeNameIndex).isEmpty())
+        return true;
+
+    if (isComponent(objectIndex))
+        return true;
+
+    QQmlPropertyCache *propertyCache = propertyCaches.at(objectIndex);
+    Q_ASSERT(propertyCache);
+
     QQmlCustomParser *customParser = 0;
     QQmlCompiledData::TypeReference objectType = resolvedTypes.value(obj->inheritedTypeNameIndex);
     if (objectType.type)
@@ -1140,6 +1136,11 @@ bool QQmlPropertyValidator::validateObject(const QV4::CompiledData::Object *obj,
 
     const QV4::CompiledData::Binding *binding = obj->bindingTable();
     for (quint32 i = 0; i < obj->nBindings; ++i, ++binding) {
+        if (binding->type >= QV4::CompiledData::Binding::Type_Object && !customParser) {
+            if (!validateObject(binding->value.objectIndex))
+                return false;
+        }
+
         if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty
             || binding->type == QV4::CompiledData::Binding::Type_GroupProperty) {
             if (customParser)
index 248cd12..4fde8f5 100644 (file)
@@ -185,7 +185,7 @@ public:
 
 
 private:
-    bool validateObject(const QV4::CompiledData::Object *obj, int objectIndex, QQmlPropertyCache *propertyCache);
+    bool validateObject(int objectIndex);
 
     bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); }