diff options
-rw-r--r-- | src/qml/compiler/qqmlcodegenerator.cpp | 12 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 32 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 2 |
3 files changed, 34 insertions, 12 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlcodegenerator.cpp index a5bb5670be..2ba13be090 100644 --- a/src/qml/compiler/qqmlcodegenerator.cpp +++ b/src/qml/compiler/qqmlcodegenerator.cpp @@ -1020,15 +1020,13 @@ void QQmlCodeGenerator::collectTypeReferences() _typeReferences.add(obj->inheritedTypeNameIndex, obj->location); for (QmlProperty *prop = obj->properties->first; prop; prop = prop->next) { - if (prop->type >= QV4::CompiledData::Property::Custom) - _typeReferences.add(prop->customTypeNameIndex, prop->location); + if (prop->type >= QV4::CompiledData::Property::Custom) { + // ### FIXME: We could report the more accurate location here by using prop->location, but the old + // compiler can't and the tests expect it to be the object location right now. + _typeReferences.add(prop->customTypeNameIndex, obj->location); + } } - for (Signal *sig = obj->qmlSignals->first; sig; sig = sig->next) - for (SignalParameter *param = sig->parameters->first; param; param = param->next) - if (!stringAt(param->customTypeNameIndex).isEmpty()) - _typeReferences.add(param->customTypeNameIndex, param->location); - for (Binding *binding = obj->bindings->first; binding; binding = binding->next) { if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) _typeReferences.add(binding->propertyNameIndex, binding->location); diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 0b76302a5d..06ee180119 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -80,13 +80,36 @@ bool QQmlTypeCompiler::compile() const QHash<int, QQmlTypeData::TypeReference> &resolvedTypes = typeData->resolvedTypeRefs(); for (QHash<int, QQmlTypeData::TypeReference>::ConstIterator resolvedType = resolvedTypes.constBegin(), end = resolvedTypes.constEnd(); resolvedType != end; ++resolvedType) { - QQmlCompiledData::TypeReference *ref = new QQmlCompiledData::TypeReference; + QScopedPointer<QQmlCompiledData::TypeReference> ref(new QQmlCompiledData::TypeReference); + QQmlType *qmlType = resolvedType->type; if (resolvedType->typeData) { + if (qmlType->isCompositeSingleton()) { + QQmlError error; + QString reason = tr("Composite Singleton Type %1 is not creatable.").arg(qmlType->qmlTypeName()); + error.setDescription(reason); + error.setColumn(resolvedType->location.column); + error.setLine(resolvedType->location.line); + recordError(error); + return false; + } ref->component = resolvedType->typeData->compiledData(); ref->component->addref(); - } else { - ref->type = resolvedType->type; + } else if (qmlType) { + ref->type = qmlType; Q_ASSERT(ref->type); + + if (!ref->type->isCreatable()) { + QQmlError error; + QString reason = ref->type->noCreationReason(); + if (reason.isEmpty()) + reason = tr("Element is not creatable."); + error.setDescription(reason); + error.setColumn(resolvedType->location.column); + error.setLine(resolvedType->location.line); + recordError(error); + return false; + } + if (ref->type->containsRevisionedAttributes()) { QQmlError cacheError; ref->typePropertyCache = engine->cache(ref->type, @@ -96,7 +119,6 @@ bool QQmlTypeCompiler::compile() cacheError.setColumn(resolvedType->location.column); cacheError.setLine(resolvedType->location.line); recordError(cacheError); - delete ref; return false; } ref->typePropertyCache->addref(); @@ -104,7 +126,7 @@ bool QQmlTypeCompiler::compile() } ref->majorVersion = resolvedType->majorVersion; ref->minorVersion = resolvedType->minorVersion; - compiledData->resolvedTypes.insert(resolvedType.key(), ref); + compiledData->resolvedTypes.insert(resolvedType.key(), ref.take()); } // Build property caches and VME meta object data diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 4340279df8..28229a13a9 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -67,6 +67,8 @@ struct Location; struct QQmlTypeCompiler { + Q_DECLARE_TR_FUNCTIONS(QQmlTypeCompiler) +public: QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlCompiledData *compiledData, QQmlTypeData *typeData, QtQml::ParsedQML *parsedQML); bool compile(); |