aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-10-21 13:39:43 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-10-22 13:11:27 +0200
commitc0063f73e5472f770133602ea2a7c6fe77f5a1b3 (patch)
tree1c756a84849ba8fca1a7ba2b6fc812643518e55d
parentebef555f49628c247cdb1fde22ddec560c7fb852 (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>
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp28
-rw-r--r--src/qml/compiler/qqmlirbuilder_p.h20
-rw-r--r--src/qml/qml/qqmlirloader.cpp4
-rw-r--r--src/qml/qml/qqmltypecompiler.cpp6
4 files changed, 41 insertions, 17 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);
diff --git a/src/qml/qml/qqmlirloader.cpp b/src/qml/qml/qqmlirloader.cpp
index fc1a3f9d91..121ac25ced 100644
--- a/src/qml/qml/qqmlirloader.cpp
+++ b/src/qml/qml/qqmlirloader.cpp
@@ -91,14 +91,14 @@ private:
QmlIR::Object *QQmlIRLoader::loadObject(const QV4::CompiledData::Object *serializedObject)
{
QmlIR::Object *object = pool->New<QmlIR::Object>();
- object->init(pool, serializedObject->inheritedTypeNameIndex, serializedObject->idNameIndex);
+ object->init(pool, serializedObject->inheritedTypeNameIndex, serializedObject->idNameIndex,
+ serializedObject->location);
object->indexOfDefaultPropertyOrAlias = serializedObject->indexOfDefaultPropertyOrAlias;
object->defaultPropertyIsAlias = serializedObject->defaultPropertyIsAlias;
object->isInlineComponent = serializedObject->flags & QV4::CompiledData::Object::IsInlineComponentRoot;
object->flags = serializedObject->flags;
object->id = serializedObject->id;
- object->location = serializedObject->location;
object->locationOfIdProperty = serializedObject->locationOfIdProperty;
QVector<int> functionIndices;
diff --git a/src/qml/qml/qqmltypecompiler.cpp b/src/qml/qml/qqmltypecompiler.cpp
index eb3b0e43ac..b885cae79c 100644
--- a/src/qml/qml/qqmltypecompiler.cpp
+++ b/src/qml/qml/qqmltypecompiler.cpp
@@ -871,8 +871,10 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QmlI
compiler->addImport(componentType.module(), qualifier, componentType.version());
QmlIR::Object *syntheticComponent = pool->New<QmlIR::Object>();
- syntheticComponent->init(pool, compiler->registerString(qualifier + QLatin1Char('.') + componentType.elementName()), compiler->registerString(QString()));
- syntheticComponent->location = binding->valueLocation;
+ syntheticComponent->init(
+ pool,
+ compiler->registerString(qualifier + QLatin1Char('.') + componentType.elementName()),
+ compiler->registerString(QString()), binding->valueLocation);
syntheticComponent->flags |= QV4::CompiledData::Object::IsComponent;
if (!containsResolvedType(syntheticComponent->inheritedTypeNameIndex)) {