diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-10-01 09:04:50 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-08 10:04:38 +0100 |
commit | 4a2f09f14a4b79006e661b6d98c03909c4ba9db1 (patch) | |
tree | c5397277abe70e03849f17f54d834e7983697ff0 /src/qml/types/qqmlconnections.cpp | |
parent | 4a662c21e669e964f9c3b835a91a38c9decf4ad4 (diff) |
[new compiler] Initial support for custom parsers
Enough to support the Connections {} element. What's missing are pre-compiled
bindings signal handlers.
Change-Id: I3ad1413fa636434d899ae8fb380249aaf40363dc
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/types/qqmlconnections.cpp')
-rw-r--r-- | src/qml/types/qqmlconnections.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/qml/types/qqmlconnections.cpp b/src/qml/types/qqmlconnections.cpp index 5e6a1a084a..b8920deb21 100644 --- a/src/qml/types/qqmlconnections.cpp +++ b/src/qml/types/qqmlconnections.cpp @@ -251,6 +251,44 @@ QQmlConnectionsParser::compile(const QList<QQmlCustomParserProperty> &props) return rv; } +QByteArray QQmlConnectionsParser::compile(const QV4::CompiledData::QmlUnit *qmlUnit, const QList<const QV4::CompiledData::Binding *> &props) +{ + QByteArray rv; + QDataStream ds(&rv, QIODevice::WriteOnly); + + for (int ii = 0; ii < props.count(); ++ii) { + const QV4::CompiledData::Binding *binding = props.at(ii); + QString propName = qmlUnit->header.stringAt(binding->propertyNameIndex); + int propLine = binding->location.line; + int propColumn = binding->location.column; + + if (!propName.startsWith(QLatin1String("on")) || !propName.at(2).isUpper()) { + error(props.at(ii), QQmlConnections::tr("Cannot assign to non-existent property \"%1\"").arg(propName)); + return QByteArray(); + } + + + if (binding->type >= QV4::CompiledData::Binding::Type_Object) { + const QV4::CompiledData::Object *target = qmlUnit->objectAt(binding->value.objectIndex); + if (!qmlUnit->header.stringAt(target->inheritedTypeNameIndex).isEmpty()) + error(binding, QQmlConnections::tr("Connections: nested objects not allowed")); + else + error(binding, QQmlConnections::tr("Connections: syntax error")); + return QByteArray(); + } if (binding->type != QV4::CompiledData::Binding::Type_Script) { + error(binding, QQmlConnections::tr("Connections: script expected")); + return QByteArray(); + } else { + ds << propName; + ds << binding->valueAsString(&qmlUnit->header); + ds << propLine; + ds << propColumn; + } + } + + return rv; +} + void QQmlConnectionsParser::setCustomData(QObject *object, const QByteArray &data) { |