diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-01-22 16:40:46 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-24 12:39:28 +0100 |
commit | 6ae57f01bb1495a74b23a81c590672ce788d5400 (patch) | |
tree | 2a40e225495a132762d22de0c066b02ecd20630f | |
parent | 72fffeb2c1086a8b5f5ce5b5410cd0c1da2404ac (diff) |
[new compiler] Fix error message when trying to create uncreatable types
Pass along the no-creation-reason properly, for regular qml types as well as
singleton types. Also don't collect custom signal parameter names as types to
resolve, as we never try to instantiate them anyway. Their type resolution to
meta-type id is done lazily when building the meta-objects.
Change-Id: I49bd51d9b851cf75cbd51afbcee168944f4350cd
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-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(); |