diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsimportvisitor.cpp')
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp index 5ff9accd97..6595b1d8d7 100644 --- a/src/qmlcompiler/qqmljsimportvisitor.cpp +++ b/src/qmlcompiler/qqmljsimportvisitor.cpp @@ -30,6 +30,7 @@ #include <QtCore/qfileinfo.h> #include <QtCore/qdir.h> +#include <QtCore/qqueue.h> QT_BEGIN_NAMESPACE @@ -60,32 +61,33 @@ void QQmlJSImportVisitor::leaveEnvironment() m_currentScope = m_currentScope->parentScope(); } -QQmlJSScope::Ptr QQmlJSImportVisitor::result() const +void QQmlJSImportVisitor::resolveAliases() { - QQmlJSScope::Ptr result = QQmlJSScope::create(); - result->setIsComposite(true); - result->setBaseTypeName(m_qmlRootScope->baseTypeName()); - const auto properties = m_qmlRootScope->properties(); - for (auto property : properties) { - if (property.isAlias()) { + QQueue<QQmlJSScope::Ptr> objects; + objects.enqueue(m_qmlRootScope); + + while (!objects.isEmpty()) { + const QQmlJSScope::Ptr object = objects.dequeue(); + const auto properties = object->properties(); + for (auto property : properties) { + if (!property.isAlias()) + continue; const auto it = m_scopesById.find(property.typeName()); - if (it != m_scopesById.end()) + if (it != m_scopesById.end()) { property.setType(QQmlJSScope::ConstPtr(*it)); - result->addProperty(property); - } else { - result->addProperty(property); + object->addProperty(property); + } } - } - - for (const auto &method : m_qmlRootScope->methods()) - result->addMethod(method); - for (const auto &enumerator : m_qmlRootScope->enums()) - result->addEnum(enumerator); + const auto childScopes = object->childScopes(); + for (const auto &childScope : childScopes) + objects.enqueue(childScope); + } +} - result->resolveTypes(m_rootScopeImports); - result->setSourceLocation(m_qmlRootScope->sourceLocation()); - return result; +QQmlJSScope::Ptr QQmlJSImportVisitor::result() const +{ + return m_qmlRootScope; } void QQmlJSImportVisitor::importExportedNames(QQmlJSScope::ConstPtr scope) @@ -126,6 +128,11 @@ bool QQmlJSImportVisitor::visit(QQmlJS::AST::UiProgram *) return true; } +void QQmlJSImportVisitor::endVisit(UiProgram *) +{ + resolveAliases(); +} + bool QQmlJSImportVisitor::visit(UiObjectDefinition *definition) { QString superType; |