aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/compiler/qqmlcodegenerator.cpp12
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp32
-rw-r--r--src/qml/compiler/qqmltypecompiler_p.h2
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();