From 92562eacbc3c614a83a734f1108ed7df02415eae Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Fri, 13 Jul 2012 15:53:04 +1000 Subject: Allow signal parameters which are custom QML object-types This commit allows lazy resolution of signal parameter types, which allows QML object types to be used as signal parameters. If a signal is emitted with an incorrect parameter type, it will be passed through as a null parameter. Task-number: QTBUG-14550 Change-Id: I7e899ad57452826cc405bed10c541f8d35789d04 Reviewed-by: Martin Jones --- src/qml/qml/qqmlscript.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/qml/qml/qqmlscript.cpp') diff --git a/src/qml/qml/qqmlscript.cpp b/src/qml/qml/qqmlscript.cpp index a237f9a2f8..985b6b6181 100644 --- a/src/qml/qml/qqmlscript.cpp +++ b/src/qml/qml/qqmlscript.cpp @@ -937,6 +937,7 @@ bool ProcessAST::visit(AST::UiPublicMember *node) if (paramLength) { signal->parameterTypes = _parser->_pool.NewRawList(paramLength); + signal->parameterTypeNames = _parser->_pool.NewRawList(paramLength); signal->parameterNames = _parser->_pool.NewRawList(paramLength); } @@ -944,6 +945,15 @@ bool ProcessAST::visit(AST::UiPublicMember *node) while (p) { const QStringRef &memberType = p->type; + if (memberType.isEmpty()) { + QQmlError error; + error.setDescription(QCoreApplication::translate("QQmlParser","Expected parameter type")); + error.setLine(node->typeToken.startLine); + error.setColumn(node->typeToken.startColumn); + _parser->_errors << error; + return false; + } + const TypeNameToType *type = 0; for(int typeIndex = 0; typeIndex < propTypeNameToTypesCount; ++typeIndex) { const TypeNameToType *t = propTypeNameToTypes + typeIndex; @@ -955,15 +965,26 @@ bool ProcessAST::visit(AST::UiPublicMember *node) } if (!type) { - QQmlError error; - error.setDescription(QCoreApplication::translate("QQmlParser","Expected parameter type")); - error.setLine(node->typeToken.startLine); - error.setColumn(node->typeToken.startColumn); - _parser->_errors << error; - return false; + if (memberType.at(0).isUpper()) { + // Must be a QML object type. + // Lazily determine type during compilation. + signal->parameterTypes[index] = Object::DynamicProperty::Custom; + signal->parameterTypeNames[index] = QHashedStringRef(p->type); + } else { + QQmlError error; + QString errStr = QCoreApplication::translate("QQmlParser","Invalid signal parameter type: "); + errStr.append(memberType.toString()); + error.setDescription(errStr); + error.setLine(node->typeToken.startLine); + error.setColumn(node->typeToken.startColumn); + _parser->_errors << error; + return false; + } + } else { + // the parameter is a known basic type + signal->parameterTypes[index] = type->type; } - - signal->parameterTypes[index] = type->type; + signal->parameterNames[index] = QHashedStringRef(p->name); p = p->next; index++; -- cgit v1.2.3