diff options
Diffstat (limited to 'src/qml/qml/qqmltypeloader.cpp')
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 8c8f8c9c25..7a54cab0f2 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -2250,12 +2250,28 @@ void QQmlTypeData::compile() m_compiledData->propertyCaches << propertyCache; } - // ### support sub-contexts - for (quint32 i = 0; i < qmlUnit->nObjects; ++i) { - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i); - const QString &id = qmlUnit->header.stringAt(obj->idIndex); - if (!id.isEmpty()) - m_compiledData->objectIndexToId.insert(i, m_compiledData->objectIndexToId.count()); + { + // Scan for anonymous components and determine their scopes. + QQmlAnonymousComponentResolver resolver(m_compiledData->url, m_compiledData->qmlUnit, m_compiledData->resolvedTypes, m_compiledData->propertyCaches); + if (!resolver.resolve()) + errors << resolver.errors; + + for (quint32 i = 0; i < qmlUnit->nObjects; ++i) { + const QV4::CompiledData::Object *obj = qmlUnit->objectAt(i); + + QHash<int, int> *objectIndexToId = 0; + QHash<int, int>::ConstIterator componentIt = resolver.objectIndexToComponentIndex.find(i); + if (componentIt != resolver.objectIndexToComponentIndex.constEnd()) { + int indexOfComponent = resolver.componentRoots[*componentIt]; + objectIndexToId = &m_compiledData->objectIndexToIdPerComponent[indexOfComponent]; + } else + objectIndexToId = &m_compiledData->objectIndexToIdForRoot; + + const QString &id = qmlUnit->header.stringAt(obj->idIndex); + if (id.isEmpty()) + continue; + objectIndexToId->insert(i, objectIndexToId->count()); + } } if (!errors.isEmpty()) { |