diff options
-rw-r--r-- | src/qml/compiler/qqmlcodegenerator.cpp | 9 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 4 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 21 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 10 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 3 |
5 files changed, 32 insertions, 15 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlcodegenerator.cpp index 344c38bf54..6776c1e91b 100644 --- a/src/qml/compiler/qqmlcodegenerator.cpp +++ b/src/qml/compiler/qqmlcodegenerator.cpp @@ -1056,14 +1056,17 @@ void QQmlCodeGenerator::recordError(const AST::SourceLocation &location, const Q void QQmlCodeGenerator::collectTypeReferences() { foreach (QmlObject *obj, _objects) { - if (!stringAt(obj->inheritedTypeNameIndex).isEmpty()) - _typeReferences.add(obj->inheritedTypeNameIndex, obj->location); + if (!stringAt(obj->inheritedTypeNameIndex).isEmpty()) { + QV4::CompiledData::TypeReference &r = _typeReferences.add(obj->inheritedTypeNameIndex, obj->location); + r.needsCreation = true; + } for (QmlProperty *prop = obj->properties->first; prop; prop = prop->next) { 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); + QV4::CompiledData::TypeReference &r = _typeReferences.add(prop->customTypeNameIndex, obj->location); + r.needsCreation = true; } } diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 6fe3567031..1dc10fbf0a 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -84,7 +84,7 @@ bool QQmlTypeCompiler::compile() QScopedPointer<QQmlCompiledData::TypeReference> ref(new QQmlCompiledData::TypeReference); QQmlType *qmlType = resolvedType->type; if (resolvedType->typeData) { - if (qmlType->isCompositeSingleton()) { + if (resolvedType->needsCreation && qmlType->isCompositeSingleton()) { QQmlError error; QString reason = tr("Composite Singleton Type %1 is not creatable.").arg(qmlType->qmlTypeName()); error.setDescription(reason); @@ -99,7 +99,7 @@ bool QQmlTypeCompiler::compile() ref->type = qmlType; Q_ASSERT(ref->type); - if (!ref->type->isCreatable()) { + if (resolvedType->needsCreation && !ref->type->isCreatable()) { QQmlError error; QString reason = ref->type->noCreationReason(); if (reason.isEmpty()) diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 06361fbf85..29b6fd564e 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -74,13 +74,24 @@ struct Location qint32 column; }; +struct TypeReference +{ + TypeReference(const Location &loc) + : location(loc) + , needsCreation(false) + {} + Location location; // first use + bool needsCreation; // whether the type needs to be creatable or not +}; + // map from name index to location of first use -struct TypeReferenceMap : QHash<int, Location> +struct TypeReferenceMap : QHash<int, TypeReference> { - void add(int nameIndex, const Location &loc) { - if (contains(nameIndex)) - return; - insert(nameIndex, loc); + TypeReference &add(int nameIndex, const Location &loc) { + Iterator it = find(nameIndex); + if (it != end()) + return *it; + return *insert(nameIndex, loc); } }; diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index f734b77eec..7c32d4f19c 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -2453,8 +2453,8 @@ void QQmlTypeData::resolveTypes() error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(name).arg(error.description())); } - error.setLine(unresolvedRef->line); - error.setColumn(unresolvedRef->column); + error.setLine(unresolvedRef->location.line); + error.setColumn(unresolvedRef->location.column); errors.prepend(error); setError(errors); @@ -2468,8 +2468,10 @@ void QQmlTypeData::resolveTypes() ref.majorVersion = majorVersion; ref.minorVersion = minorVersion; - ref.location.line = unresolvedRef->line; - ref.location.column = unresolvedRef->column; + ref.location.line = unresolvedRef->location.line; + ref.location.column = unresolvedRef->location.column; + + ref.needsCreation = unresolvedRef->needsCreation; m_resolvedTypes.insert(unresolvedRef.key(), ref); } diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index 976f5a5ffb..02797220c5 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -396,7 +396,7 @@ class Q_AUTOTEST_EXPORT QQmlTypeData : public QQmlTypeLoader::Blob public: struct TypeReference { - TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0) {} + TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0), needsCreation(true) {} QQmlScript::Location location; QQmlType *type; @@ -404,6 +404,7 @@ public: int minorVersion; QQmlTypeData *typeData; QString prefix; // used by CompositeSingleton types + bool needsCreation; }; struct ScriptReference |