src/declarative/qml/qdeclarativecompiler.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
child 37 758a864f9613
--- a/src/declarative/qml/qdeclarativecompiler.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/declarative/qml/qdeclarativecompiler.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -228,10 +228,10 @@
             }
             break;
         case QMetaType::Float:
-            if (!v->value.isNumber()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: float expected"));
+            if (!v->value.isNumber()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: number expected"));
             break;
         case QVariant::Double:
-            if (!v->value.isNumber()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: double expected"));
+            if (!v->value.isNumber()) COMPILE_EXCEPTION(v, tr("Invalid property assignment: number expected"));
             break;
         case QVariant::Color:
             {
@@ -240,6 +240,7 @@
             if (!ok) COMPILE_EXCEPTION(v, tr("Invalid property assignment: color expected"));
             }
             break;
+#ifndef QT_NO_TEXTDATE
         case QVariant::Date:
             {
             bool ok;
@@ -261,6 +262,7 @@
             if (!ok) COMPILE_EXCEPTION(v, tr("Invalid property assignment: datetime expected"));
             }
             break;
+#endif // QT_NO_TEXTDATE
         case QVariant::Point:
         case QVariant::PointF:
             {
@@ -414,6 +416,7 @@
             instr.storeColor.value = c.rgba();
             }
             break;
+#ifndef QT_NO_TEXTDATE
         case QVariant::Date:
             {
             QDate d = QDeclarativeStringConverters::dateFromString(string);
@@ -447,6 +450,7 @@
             instr.storeDateTime.valueIndex = index;
             }
             break;
+#endif // QT_NO_TEXTDATE
         case QVariant::Point:
         case QVariant::PointF:
             {
@@ -811,6 +815,10 @@
         }
     }
 
+    QDeclarativeCustomParser *cp = 0;
+    if (isCustomParser)
+        cp = output->types.at(obj->type).type->customParser();
+
     // Build all explicit properties specified
     foreach(Property *prop, obj->properties) {
 
@@ -821,7 +829,9 @@
 
         bool canDefer = false;
         if (isCustomParser) {
-            if (doesPropertyExist(prop, obj)) {
+            if (doesPropertyExist(prop, obj) && 
+                (!(cp->flags() & QDeclarativeCustomParser::AcceptsAttachedProperties) ||
+                 !isAttachedPropertyName(prop->name))) {
                 int ids = compileState.ids.count();
                 COMPILE_CHECK(buildProperty(prop, obj, objCtxt));
                 canDefer = ids == compileState.ids.count();
@@ -872,8 +882,7 @@
         defaultProperty->release();
 
     // Compile custom parser parts
-    if (isCustomParser/* && !customProps.isEmpty()*/) {
-        QDeclarativeCustomParser *cp = output->types.at(obj->type).type->customParser();
+    if (isCustomParser && !customProps.isEmpty()) {
         cp->clearErrors();
         cp->compiler = this;
         cp->object = obj;
@@ -1352,7 +1361,7 @@
     Returns true if (value) property \a prop exists on obj, false otherwise.
 */
 bool QDeclarativeCompiler::doesPropertyExist(QDeclarativeParser::Property *prop,
-                                    QDeclarativeParser::Object *obj)
+                                             QDeclarativeParser::Object *obj)
 {
     if(isAttachedPropertyName(prop->name) || prop->name == "id")
         return true;
@@ -2172,6 +2181,18 @@
     return -1;
 }
 
+const QMetaObject *QDeclarativeCompiler::resolveType(const QByteArray& name) const
+{
+    QDeclarativeType *qmltype = 0;
+    if (!enginePrivate->importDatabase.resolveType(unit->imports, name, &qmltype, 
+                                                   0, 0, 0, 0)) 
+        return 0;
+    if (!qmltype)
+        return 0;
+    return qmltype->metaObject();
+}
+
+
 // Ensures that the dynamic meta specification on obj is valid
 bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj)
 {
@@ -2195,6 +2216,10 @@
 
         if (QString::fromUtf8(prop.name).at(0).isUpper()) 
             COMPILE_EXCEPTION(&prop, tr("Property names cannot begin with an upper case letter"));
+
+        if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(prop.name))
+            COMPILE_EXCEPTION(&prop, tr("Illegal property name"));
+
         propNames.insert(prop.name);
     }
 
@@ -2204,6 +2229,8 @@
             COMPILE_EXCEPTION(obj, tr("Duplicate signal name"));
         if (QString::fromUtf8(name).at(0).isUpper()) 
             COMPILE_EXCEPTION(obj, tr("Signal names cannot begin with an upper case letter"));
+        if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(name))
+            COMPILE_EXCEPTION(obj, tr("Illegal signal name"));
         methodNames.insert(name);
     }
     for (int ii = 0; ii < obj->dynamicSlots.count(); ++ii) {
@@ -2212,6 +2239,8 @@
             COMPILE_EXCEPTION(obj, tr("Duplicate method name"));
         if (QString::fromUtf8(name).at(0).isUpper()) 
             COMPILE_EXCEPTION(obj, tr("Method names cannot begin with an upper case letter"));
+        if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(name))
+            COMPILE_EXCEPTION(obj, tr("Illegal method name"));
         methodNames.insert(name);
     }
 
@@ -2420,7 +2449,7 @@
     for (int ii = 0; ii < obj->dynamicSlots.count(); ++ii) {
         Object::DynamicSlot &s = obj->dynamicSlots[ii];
         QByteArray sig(s.name + '(');
-        QString funcScript(QLatin1String("(function("));
+        QString funcScript(QLatin1String("(function ") + s.name + QLatin1Char('('));
 
         for (int jj = 0; jj < s.parameterNames.count(); ++jj) {
             if (jj) {