aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-01-22 16:40:46 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-24 12:39:28 +0100
commit6ae57f01bb1495a74b23a81c590672ce788d5400 (patch)
tree2a40e225495a132762d22de0c066b02ecd20630f
parent72fffeb2c1086a8b5f5ce5b5410cd0c1da2404ac (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.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();