diff options
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 4 | ||||
-rw-r--r-- | src/qml/parser/qqmljs.g | 21 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 1 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 1feb61ce59..ff6396b27d 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -668,6 +668,10 @@ bool Codegen::visit(ArrayLiteral *ast) }; for (ElementList *it = ast->elements; it; it = it->next) { + if (it->isSpreadElement) { + throwSyntaxError(it->firstSourceLocation(), QLatin1String("'...' in ArrayLiterals is unimplementd.")); + return false; + } for (Elision *elision = it->elision; elision; elision = elision->next) push(nullptr); diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g index 695998e4ee..acd0bdb0cc 100644 --- a/src/qml/parser/qqmljs.g +++ b/src/qml/parser/qqmljs.g @@ -1648,6 +1648,13 @@ ElementList: Elision AssignmentExpression_In; ./ ElementList: ElisionOpt SpreadElement; +/. + case $rule_number: { + AST::ElementList *node = new (pool) AST::ElementList(sym(1).Elision, sym(2).Expression); + node->isSpreadElement = true; + sym(1).Node = node; + } break; +./ ElementList: ElementList T_COMMA ElisionOpt AssignmentExpression_In; /. @@ -1659,6 +1666,14 @@ ElementList: ElementList T_COMMA ElisionOpt AssignmentExpression_In; ./ ElementList: ElementList T_COMMA ElisionOpt SpreadElement; +/. + case $rule_number: { + AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision, sym(4).Expression); + node->commaToken = loc(2); + node->isSpreadElement = true; + sym(1).Node = node; + } break; +./ Elision: T_COMMA; /. @@ -1693,7 +1708,11 @@ ElisionOpt: Elision; ./ SpreadElement: T_ELLIPSIS AssignmentExpression; -/. case $rule_number: { UNIMPLEMENTED; } ./ +/. + case $rule_number: { + sym(1).Node = sym(2).Node; + } break; +./ ObjectLiteral: T_LBRACE T_RBRACE; /. diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 6992985097..f07d4f88bc 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -639,6 +639,7 @@ public: ExpressionNode *expression; ElementList *next; SourceLocation commaToken; + bool isSpreadElement = false; }; class QML_PARSER_EXPORT PropertyName: public Node |