diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-10-21 13:39:43 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-10-22 13:11:27 +0200 |
commit | c0063f73e5472f770133602ea2a7c6fe77f5a1b3 (patch) | |
tree | 1c756a84849ba8fca1a7ba2b6fc812643518e55d /src/qml/compiler | |
parent | ebef555f49628c247cdb1fde22ddec560c7fb852 (diff) |
QmlIR: Make sure that all objects receive a location
For grouped properties, this is the location of binding now.
Change-Id: I7148ba92150e3569d47c382ef78794bfa3b75fce
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/compiler')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 28 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder_p.h | 20 |
2 files changed, 35 insertions, 13 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index cadfda0cc3..fa25d41113 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -169,13 +169,12 @@ QV4::CompiledData::BuiltinType Parameter::stringToBuiltinType(const QString &typ return QV4::CompiledData::BuiltinType::InvalidBuiltin; } -void Object::init(QQmlJS::MemoryPool *pool, int typeNameIndex, int idIndex, const QQmlJS::SourceLocation &loc) +void Object::init(QQmlJS::MemoryPool *pool, int typeNameIndex, int idIndex, + const QV4::CompiledData::Location &loc) { + Q_ASSERT(loc.line > 0 && loc.column > 0); inheritedTypeNameIndex = typeNameIndex; - - location.line = loc.startLine; - location.column = loc.startColumn; - + location = loc; idNameIndex = idIndex; id = -1; indexOfDefaultPropertyOrAlias = -1; @@ -535,8 +534,13 @@ bool IRBuilder::visit(QQmlJS::AST::UiObjectDefinition *node) appendBinding(nameLocation, nameLocation, emptyStringIndex, idx); } else { int idx = 0; - if (!defineQMLObject(&idx, /*qualfied type name id*/nullptr, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer, /*declarations should go here*/_object)) + const QQmlJS::SourceLocation location = node->qualifiedTypeNameId->firstSourceLocation(); + if (!defineQMLObject( + &idx, /*qualfied type name id*/nullptr, + { location.startLine, location.startColumn }, node->initializer, + /*declarations should go here*/_object)) { return false; + } appendBinding(node->qualifiedTypeNameId, idx); } return false; @@ -578,8 +582,11 @@ bool IRBuilder::visit(QQmlJS::AST::UiInlineComponent *ast) bool IRBuilder::visit(QQmlJS::AST::UiObjectBinding *node) { int idx = 0; - if (!defineQMLObject(&idx, node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer)) + const QQmlJS::SourceLocation location = node->qualifiedTypeNameId->firstSourceLocation(); + if (!defineQMLObject(&idx, node->qualifiedTypeNameId, + { location.startLine, location.startColumn }, node->initializer)) { return false; + } appendBinding(node->qualifiedId, idx, node->hasOnToken); return false; } @@ -657,7 +664,10 @@ void IRBuilder::accept(QQmlJS::AST::Node *node) QQmlJS::AST::Node::accept(node, this); } -bool IRBuilder::defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, Object *declarationsOverride) +bool IRBuilder::defineQMLObject( + int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, + const QV4::CompiledData::Location &location, QQmlJS::AST::UiObjectInitializer *initializer, + Object *declarationsOverride) { if (QQmlJS::AST::UiQualifiedId *lastName = qualifiedTypeNameId) { while (lastName->next) @@ -1509,7 +1519,7 @@ bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, O binding->type = QV4::CompiledData::Binding::Type_GroupProperty; int objIndex = 0; - if (!defineQMLObject(&objIndex, nullptr, QQmlJS::SourceLocation(), nullptr, nullptr)) + if (!defineQMLObject(&objIndex, nullptr, binding->location, nullptr, nullptr)) return false; binding->value.objectIndex = objIndex; diff --git a/src/qml/compiler/qqmlirbuilder_p.h b/src/qml/compiler/qqmlirbuilder_p.h index 7e6c8c1272..058f9802ae 100644 --- a/src/qml/compiler/qqmlirbuilder_p.h +++ b/src/qml/compiler/qqmlirbuilder_p.h @@ -371,7 +371,7 @@ public: // specified object. Used for declarations inside group properties. Object *declarationsOverride; - void init(QQmlJS::MemoryPool *pool, int typeNameIndex, int idIndex, const QQmlJS::SourceLocation &location = QQmlJS::SourceLocation()); + void init(QQmlJS::MemoryPool *pool, int typeNameIndex, int idIndex, const QV4::CompiledData::Location &location); QString appendEnum(Enum *enumeration); QString appendSignal(Signal *signal); @@ -492,9 +492,21 @@ public: void accept(QQmlJS::AST::Node *node); // returns index in _objects - bool defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, Object *declarationsOverride = nullptr); - bool defineQMLObject(int *objectIndex, QQmlJS::AST::UiObjectDefinition *node, Object *declarationsOverride = nullptr) - { return defineQMLObject(objectIndex, node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer, declarationsOverride); } + bool defineQMLObject( + int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, + const QV4::CompiledData::Location &location, + QQmlJS::AST::UiObjectInitializer *initializer, Object *declarationsOverride = nullptr); + + bool defineQMLObject( + int *objectIndex, QQmlJS::AST::UiObjectDefinition *node, + Object *declarationsOverride = nullptr) + { + const QQmlJS::SourceLocation location = node->qualifiedTypeNameId->firstSourceLocation(); + return defineQMLObject( + objectIndex, node->qualifiedTypeNameId, + { location.startLine, location.startColumn }, node->initializer, + declarationsOverride); + } static QString asString(QQmlJS::AST::UiQualifiedId *node); QStringView asStringRef(QQmlJS::AST::Node *node); |