aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmlcodegenerator.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-02-19 15:55:11 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-02 11:46:53 +0100
commit579bade6604e68111324879647d03f9aa25a453b (patch)
treea224539ad4f644e1d629f9b16d4ac94f6f562f95 /src/qml/compiler/qqmlcodegenerator.cpp
parent8035d243061abe6b3b37586af688840f529e08a8 (diff)
[new compiler] Ensure that qualified type names end in an id with an upper case letter
Change-Id: I35166b86ddc7c2e87dc77b59f4d8272279ca5688 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qqmlcodegenerator.cpp')
-rw-r--r--src/qml/compiler/qqmlcodegenerator.cpp47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlcodegenerator.cpp
index 583cd110c9..aaf93bf680 100644
--- a/src/qml/compiler/qqmlcodegenerator.cpp
+++ b/src/qml/compiler/qqmlcodegenerator.cpp
@@ -259,9 +259,8 @@ bool QQmlCodeGenerator::generateFromQml(const QString &code, const QUrl &url, co
QQmlJS::AST::UiObjectDefinition *rootObject = QQmlJS::AST::cast<QQmlJS::AST::UiObjectDefinition*>(program->members->member);
Q_ASSERT(rootObject);
- output->indexOfRootObject = defineQMLObject(rootObject);
-
- collectTypeReferences();
+ if (defineQMLObject(&output->indexOfRootObject, rootObject))
+ collectTypeReferences();
qSwap(_imports, output->imports);
qSwap(_pragmas, output->pragmas);
@@ -311,10 +310,14 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectDefinition *node)
lastId = lastId->next;
bool isType = lastId->name.unicode()->isUpper();
if (isType) {
- int idx = defineQMLObject(node);
+ int idx = 0;
+ if (!defineQMLObject(&idx, node))
+ return false;
appendBinding(node->qualifiedTypeNameId->identifierToken, emptyStringIndex, idx);
} else {
- int idx = defineQMLObject(/*qualfied type name id*/0, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer, /*declarations should go here*/_object);
+ int idx = 0;
+ if (!defineQMLObject(&idx, /*qualfied type name id*/0, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer, /*declarations should go here*/_object))
+ return false;
appendBinding(node->qualifiedTypeNameId, idx);
}
return false;
@@ -322,7 +325,9 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectDefinition *node)
bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectBinding *node)
{
- int idx = defineQMLObject(node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer);
+ int idx = 0;
+ if (!defineQMLObject(&idx, node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer))
+ return false;
appendBinding(node->qualifiedId, idx, node->hasOnToken);
return false;
}
@@ -346,7 +351,9 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiArrayBinding *node)
while (member) {
QQmlJS::AST::UiObjectDefinition *def = QQmlJS::AST::cast<QQmlJS::AST::UiObjectDefinition*>(member->member);
- int idx = defineQMLObject(def);
+ int idx = 0;
+ if (!defineQMLObject(&idx, def))
+ return false;
appendBinding(name->identifierToken, registerString(name->name.toString()), idx, /*isListItem*/ true);
member = member->next;
@@ -386,11 +393,20 @@ void QQmlCodeGenerator::accept(QQmlJS::AST::Node *node)
QQmlJS::AST::Node::acceptChild(node, this);
}
-int QQmlCodeGenerator::defineQMLObject(QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::AST::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, QmlObject *declarationsOverride)
+bool QQmlCodeGenerator::defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::AST::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, QmlObject *declarationsOverride)
{
+ if (QQmlJS::AST::UiQualifiedId *lastName = qualifiedTypeNameId) {
+ while (lastName->next)
+ lastName = lastName->next;
+ if (!lastName->name.constData()->isUpper()) {
+ recordError(lastName->identifierToken, tr("Expected type name"));
+ return false;
+ }
+ }
+
QmlObject *obj = New<QmlObject>();
_objects.append(obj);
- const int objectIndex = _objects.size() - 1;
+ *objectIndex = _objects.size() - 1;
qSwap(_object, obj);
_object->init(pool, registerString(asString(qualifiedTypeNameId)), emptyStringIndex, location);
@@ -406,12 +422,17 @@ int QQmlCodeGenerator::defineQMLObject(QQmlJS::AST::UiQualifiedId *qualifiedType
qSwap(_object, obj);
+ if (!errors.isEmpty())
+ return false;
+
QQmlJS::AST::SourceLocation loc;
QString error = obj->sanityCheckFunctionNames(_functions, illegalNames, &loc);
- if (!error.isEmpty())
+ if (!error.isEmpty()) {
recordError(loc, error);
+ return false;
+ }
- return objectIndex;
+ return true;
}
bool QQmlCodeGenerator::visit(QQmlJS::AST::UiImport *node)
@@ -1103,7 +1124,9 @@ bool QQmlCodeGenerator::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToRe
else
binding->type = QV4::CompiledData::Binding::Type_GroupProperty;
- int objIndex = defineQMLObject(0, QQmlJS::AST::SourceLocation(), 0, 0);
+ int objIndex = 0;
+ if (!defineQMLObject(&objIndex, 0, QQmlJS::AST::SourceLocation(), 0, 0))
+ return false;
binding->value.objectIndex = objIndex;
QString error = (*object)->appendBinding(binding, /*isListBinding*/false);