aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/parser
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-03-22 16:34:05 +0100
committerLars Knoll <lars.knoll@qt.io>2018-04-27 08:11:28 +0000
commit02252ae08dc36ba44f65fb932c428849c7369299 (patch)
tree5c7627b08cce5bfa2df5e04b3427bcc93ef2b2fe /src/qml/parser
parente07a03365ad07cd4294f487b15a57f31bd0a3d40 (diff)
Rework the AST for Literals and destructuring expressions
Array/ObjectLiterals and destructuring expressions are syntactically very similar. In some cases (when using a destructuring expression as the lhs of an assigment), the parser needs to convert the literal into a destructuring expression. To support these, use the same data structures for both in the AST. Those Patterns can be converted with little additional work from a Literal to an AssignmentPattern and be used in all places where we need destructuring in addition to literals. Change-Id: I177599b46eab0f6e8cb2a40c3b3b11ed00a07d6a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/parser')
-rw-r--r--src/qml/parser/qqmljs.g190
-rw-r--r--src/qml/parser/qqmljsast.cpp158
-rw-r--r--src/qml/parser/qqmljsast_p.h490
-rw-r--r--src/qml/parser/qqmljsastfwd_p.h17
-rw-r--r--src/qml/parser/qqmljsastvisitor_p.h38
5 files changed, 326 insertions, 567 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index 4678b282ec..607ca8665c 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -267,7 +267,6 @@ public:
AST::CaseClauses *CaseClauses;
AST::Catch *Catch;
AST::DefaultClause *DefaultClause;
- AST::ElementList *ElementList;
AST::Elision *Elision;
AST::ExpressionNode *Expression;
AST::TemplateLiteral *Template;
@@ -276,17 +275,16 @@ public:
AST::FunctionDeclaration *FunctionDeclaration;
AST::Node *Node;
AST::PropertyName *PropertyName;
- AST::PropertyDefinition *PropertyDefinition;
- AST::PropertyDefinitionList *PropertyDefinitionList;
AST::Statement *Statement;
AST::StatementList *StatementList;
AST::Block *Block;
AST::VariableDeclaration *VariableDeclaration;
AST::VariableDeclarationList *VariableDeclarationList;
- AST::BindingPattern *BindingPattern;
- AST::BindingElement *BindingElement;
- AST::BindingPropertyList *BindingPropertyList;
- AST::BindingElementList *BindingElementList;
+ AST::Pattern *Pattern;
+ AST::PatternElement *PatternElement;
+ AST::PatternElementList *PatternElementList;
+ AST::PatternProperty *PatternProperty;
+ AST::PatternPropertyList *PatternPropertyList;
AST::ClassElementList *ClassElementList;
AST::UiProgram *UiProgram;
@@ -570,9 +568,9 @@ AST::FormalParameterList *Parser::reparseAsFormalParameterList(AST::ExpressionNo
expr = assign->left;
rhs = assign->right;
}
- AST::BindingElement *binding = nullptr;
+ AST::PatternElement *binding = nullptr;
if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(expr)) {
- binding = new (pool) AST::BindingElement(idExpr->name, rhs);
+ binding = new (pool) AST::PatternElement(idExpr->name, rhs);
binding->identifierToken = idExpr->identifierToken;
}
if (!binding)
@@ -994,7 +992,7 @@ UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList
UiObjectLiteral: T_LBRACE ExpressionStatementLookahead UiPropertyDefinitionList T_COMMA T_RBRACE;
/.
case $rule_number: {
- AST::ObjectPattern *l = new (pool) AST::ObjectPattern(sym(3).PropertyDefinitionList->finish());
+ AST::ObjectPattern *l = new (pool) AST::ObjectPattern(sym(3).PatternPropertyList->finish());
l->lbraceToken = loc(1);
l->rbraceToken = loc(4);
AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(l);
@@ -1495,7 +1493,7 @@ CoverParenthesizedExpressionAndArrowParameterList: T_LPAREN T_RPAREN;
CoverParenthesizedExpressionAndArrowParameterList: T_LPAREN BindingRestElement T_RPAREN;
/.
case $rule_number: {
- AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(2).Node))->finish();
+ AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(2).PatternElement))->finish();
sym(1).Node = node;
coverExpressionErrorLocation = loc(2);
coverExpressionType = CE_FormalParameterList;
@@ -1506,10 +1504,13 @@ CoverParenthesizedExpressionAndArrowParameterList: T_LPAREN Expression_In T_COMM
/.
case $rule_number: {
AST::FormalParameterList *list = reparseAsFormalParameterList(sym(2).Expression);
- if (!list)
+ if (!list) {
syntaxError(loc(1), "Invalid Arrow parameter list.");
- if (sym(4).Node)
- list = new (pool) AST::FormalParameterList(list, sym(4).Node);
+ return false;
+ }
+ if (sym(4).Node) {
+ list = new (pool) AST::FormalParameterList(list, sym(4).PatternElement);
+ }
coverExpressionErrorLocation = loc(4);
coverExpressionType = CE_FormalParameterList;
sym(1).Node = list->finish();
@@ -1616,7 +1617,7 @@ ArrayLiteral: T_LBRACKET ElisionOpt T_RBRACKET;
ArrayLiteral: T_LBRACKET ElementList T_RBRACKET;
/.
case $rule_number: {
- AST::ArrayPattern *node = new (pool) AST::ArrayPattern(sym(2).ElementList->finish());
+ AST::ArrayPattern *node = new (pool) AST::ArrayPattern(sym(2).PatternElementList->finish());
node->lbracketToken = loc(1);
node->rbracketToken = loc(3);
sym(1).Node = node;
@@ -1626,33 +1627,35 @@ ArrayLiteral: T_LBRACKET ElementList T_RBRACKET;
ArrayLiteral: T_LBRACKET ElementList T_COMMA ElisionOpt T_RBRACKET;
/.
case $rule_number: {
- AST::ArrayPattern *node = new (pool) AST::ArrayPattern(sym(2).ElementList->finish(), sym(4).Elision);
+ AST::ArrayPattern *node = new (pool) AST::ArrayPattern(sym(2).PatternElementList->finish(), sym(4).Elision);
node->lbracketToken = loc(1);
node->commaToken = loc(3);
node->rbracketToken = loc(5);
sym(1).Node = node;
+ Q_ASSERT(node->isValidArrayLiteral());
} break;
./
ElementList: AssignmentExpression_In;
/.
case $rule_number: {
- sym(1).Node = new (pool) AST::ElementList(nullptr, sym(1).Expression);
+ AST::PatternElement *e = new (pool) AST::PatternElement(sym(1).Expression);
+ sym(1).Node = new (pool) AST::PatternElementList(nullptr, e);
} break;
./
ElementList: Elision AssignmentExpression_In;
/.
case $rule_number: {
- sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
+ AST::PatternElement *e = new (pool) AST::PatternElement(sym(2).Expression);
+ sym(1).Node = new (pool) AST::PatternElementList(sym(1).Elision->finish(), e);
} break;
./
ElementList: ElisionOpt SpreadElement;
/.
case $rule_number: {
- AST::ElementList *node = new (pool) AST::ElementList(sym(1).Elision, sym(2).Expression);
- node->isSpreadElement = true;
+ AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement);
sym(1).Node = node;
} break;
./
@@ -1660,19 +1663,17 @@ ElementList: ElisionOpt SpreadElement;
ElementList: ElementList T_COMMA ElisionOpt AssignmentExpression_In;
/.
case $rule_number: {
- AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision, sym(4).Expression);
- node->commaToken = loc(2);
- sym(1).Node = node;
+ AST::PatternElement *e = new (pool) AST::PatternElement(sym(4).Expression);
+ AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(3).Elision, e);
+ sym(1).Node = sym(1).PatternElementList->append(node);
} break;
./
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;
+ AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(3).Elision, sym(4).PatternElement);
+ sym(1).Node = sym(1).PatternElementList->append(node);
} break;
./
@@ -1711,7 +1712,8 @@ ElisionOpt: Elision;
SpreadElement: T_ELLIPSIS AssignmentExpression;
/.
case $rule_number: {
- sym(1).Node = sym(2).Node;
+ AST::PatternElement *node = new (pool) AST::PatternElement(sym(2).Expression, AST::PatternElement::SpreadElement);
+ sym(1).Node = node;
} break;
./
@@ -1728,7 +1730,7 @@ ObjectLiteral: T_LBRACE T_RBRACE;
ObjectLiteral: T_LBRACE PropertyDefinitionList T_RBRACE;
/.
case $rule_number: {
- AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PropertyDefinitionList->finish());
+ AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList->finish());
node->lbraceToken = loc(1);
node->rbraceToken = loc(3);
sym(1).Node = node;
@@ -1738,7 +1740,7 @@ ObjectLiteral: T_LBRACE PropertyDefinitionList T_RBRACE;
ObjectLiteral: T_LBRACE PropertyDefinitionList T_COMMA T_RBRACE;
/.
case $rule_number: {
- AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PropertyDefinitionList->finish());
+ AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList->finish());
node->lbraceToken = loc(1);
node->rbraceToken = loc(4);
sym(1).Node = node;
@@ -1751,7 +1753,7 @@ UiPropertyDefinitionList: UiPropertyDefinition;
PropertyDefinitionList: PropertyDefinition;
/.
case $rule_number: {
- sym(1).Node = new (pool) AST::PropertyDefinitionList(sym(1).PropertyDefinition);
+ sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternProperty);
} break;
./
@@ -1760,8 +1762,7 @@ UiPropertyDefinitionList: UiPropertyDefinitionList T_COMMA UiPropertyDefinition;
PropertyDefinitionList: PropertyDefinitionList T_COMMA PropertyDefinition;
/.
case $rule_number: {
- AST::PropertyDefinitionList *node = new (pool) AST::PropertyDefinitionList(sym(1).PropertyDefinitionList, sym(3).PropertyDefinition);
- node->commaToken = loc(2);
+ AST::PatternPropertyList *node = new (pool) AST::PatternPropertyList(sym(1).PatternPropertyList, sym(3).PatternProperty);
sym(1).Node = node;
} break;
./
@@ -1771,9 +1772,7 @@ PropertyDefinition: IdentifierReference;
case $rule_number: {
AST::IdentifierPropertyName *name = new (pool) AST::IdentifierPropertyName(stringRef(1));
name->propertyNameToken = loc(1);
- AST::IdentifierExpression *expr = new (pool) AST::IdentifierExpression(stringRef(1));
- expr->identifierToken = loc(1);
- AST::PropertyNameAndValue *node = new (pool) AST::PropertyNameAndValue(name, expr);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(name, stringRef(1));
node->colonToken = loc(2);
sym(1).Node = node;
} break;
@@ -1792,7 +1791,7 @@ UiPropertyDefinition: UiPropertyName T_COLON AssignmentExpression_In;
PropertyDefinition: PropertyName T_COLON AssignmentExpression_In;
/.
case $rule_number: {
- AST::PropertyNameAndValue *node = new (pool) AST::PropertyNameAndValue(sym(1).PropertyName, sym(3).Expression);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, sym(3).Expression);
node->colonToken = loc(2);
sym(1).Node = node;
} break;
@@ -2826,12 +2825,12 @@ VariableDeclaration: BindingPattern Initializer;
VariableDeclaration_In: BindingPattern Initializer_In;
/. case $rule_number: { UNIMPLEMENTED; } ./
-BindingPattern: T_LBRACE ObjectBindingPattern T_RBRACE;
+BindingPattern: T_LBRACE ObjectBindingPattern T_RBRACE;
/.
case $rule_number: {
- auto *node = new (pool) AST::ObjectBindingPattern(sym(2).BindingPropertyList);
- node->first = loc(1);
- node->last = loc(3);
+ auto *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList);
+ node->lbraceToken = loc(1);
+ node->rbraceToken = loc(3);
sym(1).Node = node;
} break;
./
@@ -2839,9 +2838,9 @@ BindingPattern: T_LBRACE ObjectBindingPattern T_RBRACE;
BindingPattern: T_LBRACKET ArrayBindingPattern T_RBRACKET;
/.
case $rule_number: {
- auto *node = new (pool) AST::ArrayBindingPattern(sym(2).BindingElementList);
- node->first = loc(1);
- node->last = loc(3);
+ auto *node = new (pool) AST::ArrayPattern(sym(2).PatternElementList);
+ node->lbracketToken = loc(1);
+ node->rbracketToken = loc(3);
sym(1).Node = node;
} break;
./
@@ -2858,15 +2857,15 @@ ObjectBindingPattern: BindingPropertyList;
ObjectBindingPattern: BindingPropertyList T_COMMA;
/.
case $rule_number: {
- sym(1).Node = sym(1).BindingPropertyList->finish();
+ sym(1).Node = sym(1).PatternPropertyList->finish();
} break;
./
ArrayBindingPattern: ElisionOpt BindingRestElementOpt;
/.
case $rule_number: {
- if (sym(3).Elision || sym(4).Node) {
- auto *l = new (pool) AST::BindingElementList(sym(1).Elision, sym(2).Node);
+ if (sym(1).Elision || sym(2).Node) {
+ auto *l = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement);
sym(1).Node = l->finish();
} else {
sym(1).Node = nullptr;
@@ -2877,7 +2876,7 @@ ArrayBindingPattern: ElisionOpt BindingRestElementOpt;
ArrayBindingPattern: BindingElementList;
/.
case $rule_number: {
- sym(1).Node = sym(1).BindingElementList->finish();
+ sym(1).Node = sym(1).PatternElementList->finish();
} break;
./
@@ -2885,20 +2884,25 @@ ArrayBindingPattern: BindingElementList T_COMMA ElisionOpt BindingRestElementOpt
/.
case $rule_number: {
if (sym(3).Elision || sym(4).Node) {
- auto *l = new (pool) AST::BindingElementList(sym(3).Elision, sym(4).Node);
- l = sym(1).BindingElementList->append(l);
+ auto *l = new (pool) AST::PatternElementList(sym(3).Elision, sym(4).PatternElement);
+ l = sym(1).PatternElementList->append(l);
sym(1).Node = l;
}
- sym(1).Node = sym(1).BindingElementList->finish();
+ sym(1).Node = sym(1).PatternElementList->finish();
} break;
./
BindingPropertyList: BindingProperty;
+/.
+ case $rule_number: {
+ sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternProperty);
+ } break;
+./
BindingPropertyList: BindingPropertyList T_COMMA BindingProperty;
/.
case $rule_number: {
- sym(1).Node = sym(1).BindingPropertyList->append(sym(3).BindingPropertyList);
+ sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternPropertyList, sym(3).PatternProperty);
} break;
./
@@ -2907,14 +2911,14 @@ BindingElementList: BindingElisionElement;
BindingElementList: BindingElementList T_COMMA BindingElisionElement;
/.
case $rule_number: {
- sym(1).BindingElementList->append(sym(3).BindingElementList);
+ sym(1).PatternElementList = sym(1).PatternElementList->append(sym(3).PatternElementList);
} break;
./
BindingElisionElement: ElisionOpt BindingElement;
/.
case $rule_number: {
- sym(1).Node = new (pool) AST::BindingElementList(sym(1).Elision, sym(2).BindingElement);
+ sym(1).Node = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement);
} break;
./
@@ -2923,16 +2927,23 @@ BindingProperty: BindingIdentifier InitializerOpt_In;
/.
case $rule_number: {
AST::StringLiteralPropertyName *name = new (pool) AST::StringLiteralPropertyName(stringRef(1));
- AST::BindingElement *e = new (pool) AST::BindingElement(stringRef(1), sym(2).Expression);
- AST::BindingPropertyList *node = new (pool) AST::BindingPropertyList(name, e);
+ name->propertyNameToken = loc(1);
+ sym(1).Node = new (pool) AST::PatternProperty(name, stringRef(1), sym(2).Expression);
+ } break;
+./
+
+BindingProperty: PropertyName T_COLON BindingIdentifier InitializerOpt_In;
+/.
+ case $rule_number: {
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, stringRef(3), sym(4).Expression);
sym(1).Node = node;
} break;
./
-BindingProperty: PropertyName T_COLON BindingElement;
+BindingProperty: PropertyName T_COLON BindingPattern InitializerOpt_In;
/.
case $rule_number: {
- AST::BindingPropertyList *node = new (pool) AST::BindingPropertyList(sym(1).PropertyName, sym(3).BindingElement);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, sym(3).Pattern, sym(4).Expression);
sym(1).Node = node;
} break;
./
@@ -2940,7 +2951,7 @@ BindingProperty: PropertyName T_COLON BindingElement;
BindingElement: BindingIdentifier InitializerOpt_In;
/.
case $rule_number: {
- AST::BindingElement *node = new (pool) AST::BindingElement(stringRef(1), sym(2).Expression);
+ AST::PatternElement *node = new (pool) AST::PatternElement(stringRef(1), sym(2).Expression);
node->identifierToken = loc(1);
sym(1).Node = node;
} break;
@@ -2949,8 +2960,7 @@ BindingElement: BindingIdentifier InitializerOpt_In;
BindingElement: BindingPattern InitializerOpt_In;
/.
case $rule_number: {
- AST::BindingElement *node = new (pool) AST::BindingElement(sym(1).BindingPattern, sym(2).Expression);
- node->identifierToken = loc(1);
+ AST::PatternElement *node = new (pool) AST::PatternElement(sym(1).Pattern, sym(2).Expression);
sym(1).Node = node;
} break;
./
@@ -2958,14 +2968,19 @@ BindingElement: BindingPattern InitializerOpt_In;
BindingRestElement: T_ELLIPSIS BindingIdentifier;
/.
case $rule_number: {
- AST::BindingRestElement *node = new (pool) AST::BindingRestElement(stringRef(2));
+ AST::PatternElement *node = new (pool) AST::PatternElement(stringRef(2), nullptr, AST::PatternElement::RestElement);
node->identifierToken = loc(2);
sym(1).Node = node;
} break;
./
BindingRestElement: T_ELLIPSIS BindingPattern;
-/. case $rule_number: { UNIMPLEMENTED; } ./
+/.
+ case $rule_number: {
+ AST::PatternElement *node = new (pool) AST::PatternElement(sym(2).Pattern, nullptr, AST::PatternElement::RestElement);
+ sym(1).Node = node;
+ } break;
+./
BindingRestElementOpt: ;
/.
@@ -3476,7 +3491,7 @@ FormalsList: BindingElement;
FormalParameterList: BindingRestElement;
/.
case $rule_number: {
- AST::FormalParameterList *node = new (pool) AST::FormalParameterList(nullptr, sym(1).Node);
+ AST::FormalParameterList *node = new (pool) AST::FormalParameterList(nullptr, sym(1).PatternElement);
sym(1).Node = node;
} break;
./
@@ -3489,7 +3504,7 @@ FormalParameterList: FormalsList T_COMMA BindingRestElement;
FormalsList: FormalsList T_COMMA BindingElement;
/.
case $rule_number: {
- AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, sym(3).Node);
+ AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, sym(3).PatternElement);
sym(1).Node = node;
} break;
./
@@ -3548,7 +3563,7 @@ ArrowFunction_In: ArrowParameters T_ARROW ConciseBodyLookahead T_FORCE_BLOCK Fun
ArrowParameters: BindingIdentifier;
/.
case $rule_number: {
- AST::BindingElement *e = new (pool) AST::BindingElement(stringRef(1));
+ AST::PatternElement *e = new (pool) AST::PatternElement(stringRef(1), nullptr, AST::PatternElement::Binding);
e->identifierToken = loc(1);
sym(1).FormalParameterList = (new (pool) AST::FormalParameterList(nullptr, e))->finish();
} break;
@@ -3586,12 +3601,12 @@ MethodDefinition: PropertyName T_LPAREN StrictFormalParameters T_RPAREN Function
/.
case $rule_number: {
AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(1), sym(3).FormalParameterList, sym(6).StatementList);
- f->functionToken = loc(1);
+ f->functionToken = sym(1).PropertyName->firstSourceLocation();
f->lparenToken = loc(2);
f->rparenToken = loc(4);
f->lbraceToken = loc(5);
f->rbraceToken = loc(7);
- AST::PropertyNameAndValue *node = new (pool) AST::PropertyNameAndValue(sym(1).PropertyName, f);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, f);
node->colonToken = loc(2);
sym(1).Node = node;
} break;
@@ -3601,13 +3616,13 @@ MethodDefinition: T_STAR PropertyName T_LPAREN StrictFormalParameters T_RPAREN G
/.
case $rule_number: {
AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList);
- f->functionToken = loc(1);
+ f->functionToken = sym(2).PropertyName->firstSourceLocation();
f->lparenToken = loc(3);
f->rparenToken = loc(5);
f->lbraceToken = loc(6);
f->rbraceToken = loc(8);
f->isGenerator = true;
- AST::PropertyNameAndValue *node = new (pool) AST::PropertyNameAndValue(sym(2).PropertyName, f);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(2).PropertyName, f);
node->colonToken = loc(2);
sym(1).Node = node;
} break;
@@ -3617,12 +3632,14 @@ MethodDefinition: T_STAR PropertyName T_LPAREN StrictFormalParameters T_RPAREN G
MethodDefinition: T_GET PropertyName T_LPAREN T_RPAREN FunctionLBrace FunctionBody FunctionRBrace;
/.
case $rule_number: {
- AST::PropertyGetterSetter *node = new (pool) AST::PropertyGetterSetter(sym(2).PropertyName, sym(6).StatementList);
- node->getSetToken = loc(1);
- node->lparenToken = loc(3);
- node->rparenToken = loc(4);
- node->lbraceToken = loc(5);
- node->rbraceToken = loc(7);
+ AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), nullptr, sym(6).StatementList);
+ f->functionToken = sym(2).PropertyName->firstSourceLocation();
+ f->lparenToken = loc(3);
+ f->rparenToken = loc(4);
+ f->lbraceToken = loc(5);
+ f->rbraceToken = loc(7);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(2).PropertyName, f, AST::PatternProperty::Getter);
+ node->colonToken = loc(2);
sym(1).Node = node;
} break;
./
@@ -3630,13 +3647,14 @@ MethodDefinition: T_GET PropertyName T_LPAREN T_RPAREN FunctionLBrace FunctionBo
MethodDefinition: T_SET PropertyName T_LPAREN PropertySetParameterList T_RPAREN FunctionLBrace FunctionBody FunctionRBrace;
/.
case $rule_number: {
- AST::PropertyGetterSetter *node = new (pool) AST::PropertyGetterSetter(
- sym(2).PropertyName, sym(4).FormalParameterList, sym(7).StatementList);
- node->getSetToken = loc(1);
- node->lparenToken = loc(3);
- node->rparenToken = loc(5);
- node->lbraceToken = loc(6);
- node->rbraceToken = loc(8);
+ AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList);
+ f->functionToken = sym(2).PropertyName->firstSourceLocation();
+ f->lparenToken = loc(3);
+ f->rparenToken = loc(5);
+ f->lbraceToken = loc(6);
+ f->rbraceToken = loc(8);
+ AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(2).PropertyName, f, AST::PatternProperty::Setter);
+ node->colonToken = loc(2);
sym(1).Node = node;
} break;
./
@@ -3645,7 +3663,7 @@ MethodDefinition: T_SET PropertyName T_LPAREN PropertySetParameterList T_RPAREN
PropertySetParameterList: FormalParameter;
/.
case $rule_number: {
- AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(1).Node))->finish();
+ AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(1).PatternElement))->finish();
sym(1).Node = node;
} break;
./
@@ -3850,7 +3868,7 @@ ClassElementList: ClassElementList ClassElement;
ClassElement: MethodDefinition;
/.
case $rule_number: {
- AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(1).PropertyDefinition, false);
+ AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(1).PatternProperty, false);
sym(1).Node = node;
} break;
./
@@ -3859,7 +3877,7 @@ ClassElement: ClassStaticQualifier MethodDefinition;
/.
case $rule_number: {
lexer->setStaticIsKeyword(true);
- AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(2).PropertyDefinition, true);
+ AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(2).PatternProperty, true);
sym(1).Node = node;
} break;
./
diff --git a/src/qml/parser/qqmljsast.cpp b/src/qml/parser/qqmljsast.cpp
index c27b049e5d..3aa6f83934 100644
--- a/src/qml/parser/qqmljsast.cpp
+++ b/src/qml/parser/qqmljsast.cpp
@@ -200,22 +200,22 @@ void ArrayPattern::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-void ObjectPattern::accept0(Visitor *visitor)
-{
- if (visitor->visit(this)) {
- accept(properties, visitor);
+bool ArrayPattern::isValidArrayLiteral(SourceLocation *errorLocation) const {
+ for (PatternElementList *it = elements; it != nullptr; it = it->next) {
+ PatternElement *e = it->element;
+ if (e && e->bindingPattern != nullptr) {
+ if (errorLocation)
+ *errorLocation = e->firstSourceLocation();
+ return false;
+ }
}
-
- visitor->endVisit(this);
+ return true;
}
-void ElementList::accept0(Visitor *visitor)
+void ObjectPattern::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
- for (ElementList *it = this; it; it = it->next) {
- accept(it->elision, visitor);
- accept(it->expression, visitor);
- }
+ accept(properties, visitor);
}
visitor->endVisit(this);
@@ -230,38 +230,6 @@ void Elision::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-void PropertyNameAndValue::accept0(Visitor *visitor)
-{
- if (visitor->visit(this)) {
- accept(name, visitor);
- accept(value, visitor);
- }
-
- visitor->endVisit(this);
-}
-
-void PropertyGetterSetter::accept0(Visitor *visitor)
-{
- if (visitor->visit(this)) {
- accept(name, visitor);
- accept(formals, visitor);
- accept(functionBody, visitor);
- }
-
- visitor->endVisit(this);
-}
-
-void PropertyDefinitionList::accept0(Visitor *visitor)
-{
- if (visitor->visit(this)) {
- for (PropertyDefinitionList *it = this; it; it = it->next) {
- accept(it->assignment, visitor);
- }
- }
-
- visitor->endVisit(this);
-}
-
void IdentifierPropertyName::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -786,18 +754,15 @@ QStringList FormalParameterList::formals() const
QStringList formals;
int i = 0;
for (const FormalParameterList *it = this; it; it = it->next) {
- QString name;
- if (QQmlJS::AST::BindingElement *b = it->bindingElement()) {
- name = b->name;
- } else if (QQmlJS::AST::BindingRestElement *r = it->bindingRestElement()) {
- name = r->name.toString();
+ if (it->element) {
+ QString name = it->element->bindingIdentifier;
+ int duplicateIndex = formals.indexOf(name);
+ if (duplicateIndex >= 0) {
+ // change the name of the earlier argument to enforce the lookup semantics from the spec
+ formals[duplicateIndex] += QLatin1String("#") + QString::number(i);
+ }
+ formals += name;
}
- int duplicateIndex = formals.indexOf(name);
- if (duplicateIndex >= 0) {
- // change the name of the earlier argument to enforce the lookup semantics from the spec
- formals[duplicateIndex] += QLatin1String("#") + QString::number(i);
- }
- formals += name;
++i;
}
return formals;
@@ -807,11 +772,8 @@ QStringList FormalParameterList::boundNames() const
{
QStringList names;
for (const FormalParameterList *it = this; it; it = it->next) {
- if (QQmlJS::AST::BindingElement *b = it->bindingElement()) {
- b->boundNames(&names);
- } else if (QQmlJS::AST::BindingRestElement *r = it->bindingRestElement()) {
- names += r->name.toString();
- }
+ if (it->element)
+ it->element->boundNames(&names);
}
return names;
}
@@ -819,11 +781,7 @@ QStringList FormalParameterList::boundNames() const
void FormalParameterList::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
- if (BindingElement *b = bindingElement()) {
- accept(b, visitor);
- } else if (BindingRestElement *r = bindingRestElement()) {
- accept(r, visitor);
- }
+ accept(element, visitor);
if (next)
accept(next, visitor);
}
@@ -838,11 +796,8 @@ FormalParameterList *FormalParameterList::finish()
int i = 0;
for (const FormalParameterList *it = this; it; it = it->next) {
- QString name;
- if (QQmlJS::AST::BindingElement *b = it->bindingElement()) {
- if (b->name.isEmpty())
- name = QLatin1String("arg#") + QString::number(i);
- }
+ if (it->element && it->element->bindingIdentifier.isEmpty())
+ it->element->bindingIdentifier = QLatin1String("arg#") + QString::number(i);
++i;
}
return front;
@@ -1042,82 +997,79 @@ void TaggedTemplate::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-void BindingRestElement::accept0(Visitor *visitor)
-{
- if (visitor->visit(this)) {
- }
-
- visitor->endVisit(this);
-}
-
-void BindingElement::accept0(Visitor *visitor)
+void PatternElement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
+ accept(bindingPattern, visitor);
accept(initializer, visitor);
}
visitor->endVisit(this);
}
-void BindingElement::boundNames(QStringList *names)
+void PatternElement::boundNames(QStringList *names)
{
- if (binding) {
- if (BindingElementList *e = elementList())
+ if (bindingPattern) {
+ if (PatternElementList *e = elementList())
e->boundNames(names);
- else if (BindingPropertyList *p = propertyList())
+ else if (PatternPropertyList *p = propertyList())
p->boundNames(names);
- } else
- names->append(name);
+ } else {
+ names->append(bindingIdentifier);
+ }
}
-void BindingElementList::accept0(Visitor *visitor)
+void PatternElementList::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
+ accept(elision, visitor);
+ accept(element, visitor);
+ if (next)
+ accept(next, visitor);
}
visitor->endVisit(this);
}
-void BindingElementList::boundNames(QStringList *names)
+void PatternElementList::boundNames(QStringList *names)
{
- for (BindingElementList *it = this; it; it = it->next) {
- if (BindingElement *e = it->bindingElement())
- e->boundNames(names);
- else if (BindingRestElement *r = it->bindingRestElement())
- names->append(r->name.toString());
+ for (PatternElementList *it = this; it; it = it->next) {
+ if (it->element)
+ it->element->boundNames(names);
}
}
-void BindingPropertyList::accept0(Visitor *visitor)
+void PatternProperty::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
+ accept(name, visitor);
+ accept(bindingPattern, visitor);
+ accept(initializer, visitor);
}
visitor->endVisit(this);
}
-void BindingPropertyList::boundNames(QStringList *names)
+void PatternProperty::boundNames(QStringList *names)
{
- for (BindingPropertyList *it = this; it; it = it->next)
- it->binding->boundNames(names);
+ PatternElement::boundNames(names);
}
-void ObjectBindingPattern::accept0(Visitor *visitor)
+void PatternPropertyList::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
- accept(properties, visitor);
+ accept(property, visitor);
+ if (next)
+ accept(next, visitor);
}
visitor->endVisit(this);
}
-void ArrayBindingPattern::accept0(Visitor *visitor)
+void PatternPropertyList::boundNames(QStringList *names)
{
- if (visitor->visit(this)) {
- accept(elements, visitor);
- }
-
- visitor->endVisit(this);
+ for (PatternPropertyList *it = this; it; it = it->next)
+ it->property->boundNames(names);
}
void ComputedPropertyName::accept0(Visitor *visitor)
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h
index 19f1beb803..5c0ef707d5 100644
--- a/src/qml/parser/qqmljsast_p.h
+++ b/src/qml/parser/qqmljsast_p.h
@@ -128,7 +128,7 @@ public:
Kind_Undefined,
Kind_ArgumentList,
- Kind_ArrayLiteral,
+ Kind_ArrayPattern,
Kind_ArrayMemberExpression,
Kind_BinaryExpression,
Kind_Block,
@@ -174,7 +174,7 @@ public:
Kind_YieldExpression,
Kind_NumericLiteral,
Kind_NumericLiteralPropertyName,
- Kind_ObjectLiteral,
+ Kind_ObjectPattern,
Kind_PostDecrementExpression,
Kind_PostIncrementExpression,
Kind_PreDecrementExpression,
@@ -207,13 +207,12 @@ public:
Kind_WhileStatement,
Kind_WithStatement,
Kind_NestedExpression,
- Kind_ArrayBindingPattern,
- Kind_ObjectBindingPattern,
- Kind_BindingElement,
- Kind_BindingElementList,
- Kind_BindingPropertyList,
- Kind_BindingRestElement,
Kind_ClassElementList,
+ Kind_PatternElement,
+ Kind_PatternElementList,
+ Kind_PatternProperty,
+ Kind_PatternPropertyList,
+
Kind_UiArrayBinding,
Kind_UiImport,
@@ -504,20 +503,25 @@ public:
SourceLocation literalToken;
};
-class QML_PARSER_EXPORT ArrayPattern : public ExpressionNode
+class QML_PARSER_EXPORT Pattern : public ExpressionNode
+{
+
+};
+
+class QML_PARSER_EXPORT ArrayPattern : public Pattern
{
public:
- QQMLJS_DECLARE_AST_NODE(ArrayLiteral)
+ QQMLJS_DECLARE_AST_NODE(ArrayPattern)
ArrayPattern(Elision *e)
: elision(e)
{ kind = K; }
- ArrayPattern(ElementList *elts)
+ ArrayPattern(PatternElementList *elts)
: elements(elts)
{ kind = K; }
- ArrayPattern(ElementList *elts, Elision *e)
+ ArrayPattern(PatternElementList *elts, Elision *e)
: elements(elts), elision(e)
{ kind = K; }
@@ -529,24 +533,27 @@ public:
SourceLocation lastSourceLocation() const override
{ return rbracketToken; }
+ bool isValidArrayLiteral(SourceLocation *errorLocation = nullptr) const;
+
// attributes
- ElementList *elements = nullptr;
+ PatternElementList *elements = nullptr;
Elision *elision = nullptr;
SourceLocation lbracketToken;
SourceLocation commaToken;
SourceLocation rbracketToken;
};
-class QML_PARSER_EXPORT ObjectPattern : public ExpressionNode
+class QML_PARSER_EXPORT ObjectPattern : public Pattern
{
public:
- QQMLJS_DECLARE_AST_NODE(ObjectLiteral)
+ QQMLJS_DECLARE_AST_NODE(ObjectPattern)
ObjectPattern()
{ kind = K; }
- ObjectPattern(PropertyDefinitionList *plist):
- properties (plist) { kind = K; }
+ ObjectPattern(PatternPropertyList *plist)
+ : properties(plist)
+ { kind = K; }
void accept0(Visitor *visitor) override;
@@ -557,7 +564,7 @@ public:
{ return rbraceToken; }
// attributes
- PropertyDefinitionList *properties = nullptr;
+ PatternPropertyList *properties = nullptr;
SourceLocation lbraceToken;
SourceLocation rbraceToken;
};
@@ -597,54 +604,6 @@ public:
SourceLocation commaToken;
};
-class QML_PARSER_EXPORT ElementList: public Node
-{
-public:
- QQMLJS_DECLARE_AST_NODE(ElementList)
-
- ElementList(Elision *e, ExpressionNode *expr):
- elision (e), expression (expr), next (this)
- { kind = K; }
-
- ElementList(ElementList *previous, Elision *e, ExpressionNode *expr):
- elision (e), expression (expr)
- {
- kind = K;
- next = previous->next;
- previous->next = this;
- }
-
- inline ElementList *finish ()
- {
- ElementList *front = next;
- next = nullptr;
- return front;
- }
-
- void accept0(Visitor *visitor) override;
-
- SourceLocation firstSourceLocation() const override
- {
- if (elision)
- return elision->firstSourceLocation();
- return expression->firstSourceLocation();
- }
-
- SourceLocation lastSourceLocation() const override
- {
- if (next)
- return next->lastSourceLocation();
- return expression->lastSourceLocation();
- }
-
-// attributes
- Elision *elision;
- ExpressionNode *expression;
- ElementList *next;
- SourceLocation commaToken;
- bool isSpreadElement = false;
-};
-
class QML_PARSER_EXPORT PropertyName: public Node
{
public:
@@ -664,120 +623,172 @@ public:
SourceLocation propertyNameToken;
};
-class QML_PARSER_EXPORT PropertyDefinition: public Node
+class QML_PARSER_EXPORT PatternElement : public Node
{
public:
- PropertyDefinition(PropertyName *n)
- : name(n)
- {}
+ QQMLJS_DECLARE_AST_NODE(PatternElement)
+
+ enum Type {
+ // object literal types
+ Literal,
+ Getter,
+ Setter,
+
+ // used by both bindings and literals
+ SpreadElement,
+ RestElement = SpreadElement,
+
+ // binding types
+ Binding,
+ };
+
+ PatternElement(ExpressionNode *i = nullptr, Type t = Literal)
+ : initializer(i), type(t)
+ { kind = K; }
+
+ PatternElement(const QStringRef &n, ExpressionNode *i = nullptr, Type t = Binding)
+ : bindingIdentifier(n.toString()), initializer(i), type(t)
+ {
+ Q_ASSERT(t >= RestElement);
+ kind = K;
+ }
+
+ PatternElement(Pattern *pattern, ExpressionNode *i = nullptr, Type t = Binding)
+ : bindingPattern(pattern), initializer(i), type(t)
+ {
+ Q_ASSERT(t >= RestElement);
+ kind = K;
+ }
+
+ void accept0(Visitor *visitor) override;
SourceLocation firstSourceLocation() const override
- { return name->firstSourceLocation(); }
+ { return identifierToken.isValid() ? identifierToken : (bindingPattern ? bindingPattern->firstSourceLocation() : initializer->firstSourceLocation()); }
SourceLocation lastSourceLocation() const override
- { return name->lastSourceLocation(); }
+ { return initializer ? initializer->lastSourceLocation() : (bindingPattern ? bindingPattern->lastSourceLocation() : identifierToken); }
+
+ PatternElementList *elementList() const { ArrayPattern *a = cast<ArrayPattern *>(bindingPattern); return a ? a->elements : nullptr; }
+ PatternPropertyList *propertyList() const { ObjectPattern *o = cast<ObjectPattern *>(bindingPattern); return o ? o->properties : nullptr; }
+
+ virtual void boundNames(QStringList *names);
// attributes
- PropertyName *name;
+ SourceLocation identifierToken;
+ QString bindingIdentifier;
+ Pattern *bindingPattern = nullptr;
+ ExpressionNode *initializer = nullptr;
+ Type type = Literal;
};
-class QML_PARSER_EXPORT PropertyDefinitionList: public Node
+class QML_PARSER_EXPORT PatternElementList : public Node
{
public:
- QQMLJS_DECLARE_AST_NODE(PropertyDefinitionList)
+ QQMLJS_DECLARE_AST_NODE(PatternElementList)
- PropertyDefinitionList(PropertyDefinition *assignment)
- : assignment(assignment)
- , next(this)
+ PatternElementList(Elision *elision, PatternElement *element)
+ : elision(elision), element(element), next(this)
{ kind = K; }
- PropertyDefinitionList(PropertyDefinitionList *previous, PropertyDefinition *assignment)
- : assignment(assignment)
- {
- kind = K;
- next = previous->next;
- previous->next = this;
+ PatternElementList *append(PatternElementList *n) {
+ n->next = next;
+ next = n;
+ return n;
}
- inline PropertyDefinitionList *finish ()
+ inline PatternElementList *finish ()
{
- PropertyDefinitionList *front = next;
- next = nullptr;
+ PatternElementList *front = next;
+ next = 0;
return front;
}
void accept0(Visitor *visitor) override;
+ void boundNames(QStringList *names);
+
SourceLocation firstSourceLocation() const override
- { return assignment->firstSourceLocation(); }
+ { return elision ? elision->firstSourceLocation() : element->firstSourceLocation(); }
SourceLocation lastSourceLocation() const override
- { return next ? next->lastSourceLocation() : assignment->lastSourceLocation(); }
+ { return next ? next->lastSourceLocation() : (element ? element->lastSourceLocation() : elision->lastSourceLocation()); }
-// attributes
- PropertyDefinition *assignment;
- PropertyDefinitionList *next;
- SourceLocation commaToken;
+ Elision *elision = nullptr;
+ PatternElement *element = nullptr;
+ PatternElementList *next;
};
-class QML_PARSER_EXPORT PropertyNameAndValue: public PropertyDefinition
+class QML_PARSER_EXPORT PatternProperty : public PatternElement
{
public:
- QQMLJS_DECLARE_AST_NODE(PropertyNameAndValue)
+ QQMLJS_DECLARE_AST_NODE(PatternProperty)
+
+ PatternProperty(PropertyName *name, ExpressionNode *i = nullptr, Type t = Literal)
+ : PatternElement(i, t), name(name)
+ { kind = K; }
- PropertyNameAndValue(PropertyName *n, ExpressionNode *v)
- : PropertyDefinition(n), value(v)
+ PatternProperty(PropertyName *name, const QStringRef &n, ExpressionNode *i = nullptr)
+ : PatternElement(n, i), name(name)
+ { kind = K; }
+
+ PatternProperty(PropertyName *name, Pattern *pattern, ExpressionNode *i = nullptr)
+ : PatternElement(pattern, i), name(name)
{ kind = K; }
void accept0(Visitor *visitor) override;
SourceLocation firstSourceLocation() const override
{ return name->firstSourceLocation(); }
-
SourceLocation lastSourceLocation() const override
- { return value->lastSourceLocation(); }
+ {
+ SourceLocation loc = PatternElement::lastSourceLocation();
+ return loc.isValid() ? loc : name->lastSourceLocation();
+ }
+
+ void boundNames(QStringList *names) override;
// attributes
+ PropertyName *name;
SourceLocation colonToken;
- ExpressionNode *value;
- SourceLocation commaToken;
};
-class QML_PARSER_EXPORT PropertyGetterSetter: public PropertyDefinition
+
+class QML_PARSER_EXPORT PatternPropertyList : public Node
{
public:
- QQMLJS_DECLARE_AST_NODE(PropertyGetterSetter)
+ QQMLJS_DECLARE_AST_NODE(PatternPropertyList)
- enum Type {
- Getter,
- Setter
- };
-
- PropertyGetterSetter(PropertyName *n, StatementList *b)
- : PropertyDefinition(n), type(Getter), formals(nullptr), functionBody(b)
+ PatternPropertyList(PatternProperty *property)
+ : property(property), next(this)
{ kind = K; }
- PropertyGetterSetter(PropertyName *n, FormalParameterList *f, StatementList *b)
- : PropertyDefinition(n), type(Setter), formals(f), functionBody(b)
- { kind = K; }
+ PatternPropertyList(PatternPropertyList *previous, PatternProperty *property)
+ : property(property), next(this)
+ {
+ kind = K;
+ next = previous->next;
+ previous->next = this;
+ }
void accept0(Visitor *visitor) override;
+ void boundNames(QStringList *names);
+
+ inline PatternPropertyList *finish ()
+ {
+ PatternPropertyList *front = next;
+ next = 0;
+ return front;
+ }
+
SourceLocation firstSourceLocation() const override
- { return getSetToken; }
+ { return property->firstSourceLocation(); }
SourceLocation lastSourceLocation() const override
- { return rbraceToken; }
+ { return next ? next->lastSourceLocation() : property->lastSourceLocation(); }
-// attributes
- Type type;
- SourceLocation getSetToken;
- SourceLocation lparenToken;
- FormalParameterList *formals;
- SourceLocation rparenToken;
- SourceLocation lbraceToken;
- StatementList *functionBody;
- SourceLocation rbraceToken;
+ PatternProperty *property;
+ PatternPropertyList *next;
};
class QML_PARSER_EXPORT IdentifierPropertyName : public PropertyName
@@ -2149,191 +2160,6 @@ public:
SourceLocation rbraceToken;
};
-class QML_PARSER_EXPORT BindingRestElement : public Node
-{
-public:
- QQMLJS_DECLARE_AST_NODE(BindingRestElement)
-
- BindingRestElement(const QStringRef &n)
- : name(n)
- { kind = K; }
-
- void accept0(Visitor *visitor) override;
-
- SourceLocation firstSourceLocation() const override
- { return identifierToken; }
-
- SourceLocation lastSourceLocation() const override
- { return identifierToken; }
-
-// attributes
- SourceLocation identifierToken;
- QStringRef name;
-};
-
-class QML_PARSER_EXPORT BindingPattern : public Node
-{
-public:
-
- SourceLocation firstSourceLocation() const override
- { return first; }
-
- SourceLocation lastSourceLocation() const override
- { return last; }
-
- SourceLocation first;
- SourceLocation last;
-};
-
-class QML_PARSER_EXPORT ObjectBindingPattern : public BindingPattern
-{
-public:
- QQMLJS_DECLARE_AST_NODE(ObjectBindingPattern)
-
- ObjectBindingPattern(BindingPropertyList *p)
- : properties(p)
- { kind = K; }
-
- void accept0(Visitor *visitor) override;
-
- BindingPropertyList *properties;
-};
-
-class QML_PARSER_EXPORT ArrayBindingPattern : public BindingPattern
-{
-public:
- QQMLJS_DECLARE_AST_NODE(ArrayBindingPattern)
-
- ArrayBindingPattern(BindingElementList *e)
- : elements(e)
- { kind = K; }
-
- void accept0(Visitor *visitor) override;
-
- BindingElementList *elements;
-};
-
-class QML_PARSER_EXPORT BindingElement : public Node
-{
-public:
- QQMLJS_DECLARE_AST_NODE(BindingElement)
-
- BindingElement(const QStringRef &n, ExpressionNode *i = nullptr)
- : name(n.toString()), initializer(i)
- { kind = K; }
-
- BindingElement(BindingPattern *binding, ExpressionNode *i = nullptr)
- : binding(binding), initializer(i)
- { kind = K; }
-
- void accept0(Visitor *visitor) override;
-
- SourceLocation firstSourceLocation() const override
- { return identifierToken; }
-
- SourceLocation lastSourceLocation() const override
- { return initializer ? initializer->lastSourceLocation() : (binding ? binding->lastSourceLocation() : identifierToken); }
-
- BindingElementList *elementList() const {
- ArrayBindingPattern *p = cast<ArrayBindingPattern *>(binding);
- return p ? p->elements : nullptr;
- }
- BindingPropertyList *propertyList() const {
- ObjectBindingPattern *p = cast<ObjectBindingPattern *>(binding);
- return p ? p->properties : nullptr;
- }
-
- void boundNames(QStringList *names);
-
-// attributes
- SourceLocation identifierToken;
- BindingPattern *binding = nullptr;
- QString name;
- ExpressionNode *initializer = nullptr;
-};
-
-class QML_PARSER_EXPORT BindingElementList : public Node
-{
-public:
- QQMLJS_DECLARE_AST_NODE(BindingElementList)
-
- BindingElementList(Elision *e, Node *p)
- : elision(e), param(p), next(this)
- { kind = K; }
-
- BindingElementList *append(BindingElementList *n) {
- n->next = next;
- next = n;
- return n;
- }
-
- inline BindingElementList *finish ()
- {
- BindingElementList *front = next;
- next = 0;
- return front;
- }
-
- BindingRestElement *bindingRestElement() const {
- return cast<BindingRestElement *>(param);
- }
-
- BindingElement *bindingElement() const {
- return cast<BindingElement *>(param);
- }
-
- void accept0(Visitor *visitor) override;
-
- void boundNames(QStringList *names);
-
- SourceLocation firstSourceLocation() const override
- { return elision ? elision->firstSourceLocation() : param->firstSourceLocation(); }
-
- SourceLocation lastSourceLocation() const override
- { return next ? next->lastSourceLocation() : (param ? param->lastSourceLocation() : elision->lastSourceLocation()); }
-
- Elision *elision = nullptr;
- Node *param = nullptr;
- BindingElementList *next;
-};
-
-class QML_PARSER_EXPORT BindingPropertyList : public Node
-{
-public:
- QQMLJS_DECLARE_AST_NODE(BindingPropertyList)
-
- BindingPropertyList(PropertyName *n, BindingElement *e)
- : propertyName(n), binding(e), next(this)
- { kind = K; }
-
- void accept0(Visitor *visitor) override;
-
- void boundNames(QStringList *names);
-
- BindingPropertyList *append(BindingPropertyList *n) {
- n->next = next;
- next = n;
- return n;
- }
-
- inline BindingPropertyList *finish ()
- {
- BindingPropertyList *front = next;
- next = 0;
- return front;
- }
-
- SourceLocation firstSourceLocation() const override
- { return propertyName->firstSourceLocation(); }
-
- SourceLocation lastSourceLocation() const override
- { return next ? next->lastSourceLocation() : binding->lastSourceLocation(); }
-
- PropertyName *propertyName;
- BindingElement *binding;
- BindingPropertyList *next;
-};
-
class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression
{
public:
@@ -2351,8 +2177,8 @@ class QML_PARSER_EXPORT FormalParameterList: public Node
public:
QQMLJS_DECLARE_AST_NODE(FormalParameterList)
- FormalParameterList(FormalParameterList *previous, Node *p)
- : param(p)
+ FormalParameterList(FormalParameterList *previous, PatternElement *e)
+ : element(e)
{
kind = K;
if (previous) {
@@ -2369,22 +2195,14 @@ public:
return n;
}
- BindingRestElement *bindingRestElement() const {
- return cast<BindingRestElement *>(param);
- }
-
- BindingElement *bindingElement() const {
- return cast<BindingElement *>(param);
- }
-
bool isSimpleParameterList()
{
AST::FormalParameterList *formals = this;
while (formals) {
- if (formals->bindingRestElement())
+ PatternElement *e = formals->element;
+ if (e && e->type == PatternElement::RestElement)
return false;
- BindingElement *e = formals->bindingElement();
- if (e && (e->initializer || e->binding))
+ if (e && (e->initializer || e->bindingPattern))
return false;
formals = formals->next;
}
@@ -2397,11 +2215,11 @@ public:
int l = 0;
AST::FormalParameterList *formals = this;
while (formals) {
- if (formals->bindingRestElement())
- break;
- BindingElement *e = formals->bindingElement();
+ PatternElement *e = formals->element;
if (!e || e->initializer)
break;
+ if (e->type == PatternElement::RestElement)
+ break;
++l;
formals = formals->next;
}
@@ -2410,14 +2228,10 @@ public:
bool containsName(const QString &name) const {
for (const FormalParameterList *it = this; it; it = it->next) {
- if (QQmlJS::AST::BindingElement *b = it->bindingElement()) {
- // ### handle binding patterns
- if (b->name == name)
- return true;
- } else if (QQmlJS::AST::BindingRestElement *r = it->bindingRestElement()) {
- if (r->name == name)
- return true;
- }
+ PatternElement *b = it->element;
+ // ### handle binding patterns
+ if (b && b->bindingIdentifier == name)
+ return true;
}
return false;
}
@@ -2429,15 +2243,15 @@ public:
void accept0(Visitor *visitor) override;
SourceLocation firstSourceLocation() const override
- { return param->firstSourceLocation(); }
+ { return element->firstSourceLocation(); }
SourceLocation lastSourceLocation() const override
- { return next ? next->lastSourceLocation() : param->lastSourceLocation(); }
+ { return next ? next->lastSourceLocation() : element->lastSourceLocation(); }
FormalParameterList *finish();
// attributes
- Node *param = nullptr;
+ PatternElement *element = nullptr;
FormalParameterList *next;
};
@@ -2473,7 +2287,7 @@ class QML_PARSER_EXPORT ClassElementList : public Node
public:
QQMLJS_DECLARE_AST_NODE(ClassElementList)
- ClassElementList(PropertyDefinition *property, bool isStatic)
+ ClassElementList(PatternProperty *property, bool isStatic)
: isStatic(isStatic), property(property)
{
kind = K;
@@ -2502,7 +2316,7 @@ public:
bool isStatic;
ClassElementList *next;
- PropertyDefinition *property;
+ PatternProperty *property;
};
class QML_PARSER_EXPORT Program: public Node
diff --git a/src/qml/parser/qqmljsastfwd_p.h b/src/qml/parser/qqmljsastfwd_p.h
index 4661c2eb1e..590f4480a9 100644
--- a/src/qml/parser/qqmljsastfwd_p.h
+++ b/src/qml/parser/qqmljsastfwd_p.h
@@ -94,13 +94,14 @@ class NumericLiteral;
class StringLiteral;
class TemplateLiteral;
class RegExpLiteral;
+class Pattern;
class ArrayPattern;
class ObjectPattern;
-class ElementList;
+class PatternElement;
+class PatternElementList;
+class PatternProperty;
+class PatternPropertyList;
class Elision;
-class PropertyDefinitionList;
-class PropertyGetterSetter;
-class PropertyNameAndValue;
class PropertyName;
class IdentifierPropertyName;
class StringLiteralPropertyName;
@@ -162,14 +163,6 @@ class FormalParameterList;
class Program;
class DebuggerStatement;
class NestedExpression;
-class BindingPattern;
-class ArrayBindingPattern;
-class ObjectBindingPattern;
-class BindingElement;
-class BindingElementList;
-class BindingPropertyList;
-class BindingElement;
-class BindingRestElement;
class ClassExpression;
class ClassElementList;
diff --git a/src/qml/parser/qqmljsastvisitor_p.h b/src/qml/parser/qqmljsastvisitor_p.h
index a8534ca684..184fcecd1c 100644
--- a/src/qml/parser/qqmljsastvisitor_p.h
+++ b/src/qml/parser/qqmljsastvisitor_p.h
@@ -143,20 +143,20 @@ public:
virtual bool visit(ObjectPattern *) { return true; }
virtual void endVisit(ObjectPattern *) {}
- virtual bool visit(ElementList *) { return true; }
- virtual void endVisit(ElementList *) {}
+ virtual bool visit(PatternElementList *) { return true; }
+ virtual void endVisit(PatternElementList *) {}
- virtual bool visit(Elision *) { return true; }
- virtual void endVisit(Elision *) {}
+ virtual bool visit(PatternPropertyList *) { return true; }
+ virtual void endVisit(PatternPropertyList *) {}
- virtual bool visit(PropertyDefinitionList *) { return true; }
- virtual void endVisit(PropertyDefinitionList *) {}
+ virtual bool visit(PatternElement *) { return true; }
+ virtual void endVisit(PatternElement *) {}
- virtual bool visit(PropertyNameAndValue *) { return true; }
- virtual void endVisit(PropertyNameAndValue *) {}
+ virtual bool visit(PatternProperty *) { return true; }
+ virtual void endVisit(PatternProperty *) {}
- virtual bool visit(PropertyGetterSetter *) { return true; }
- virtual void endVisit(PropertyGetterSetter *) {}
+ virtual bool visit(Elision *) { return true; }
+ virtual void endVisit(Elision *) {}
virtual bool visit(NestedExpression *) { return true; }
virtual void endVisit(NestedExpression *) {}
@@ -329,24 +329,6 @@ public:
virtual bool visit(FunctionExpression *) { return true; }
virtual void endVisit(FunctionExpression *) {}
- virtual bool visit(ObjectBindingPattern *) { return true; }
- virtual void endVisit(ObjectBindingPattern *) {}
-
- virtual bool visit(ArrayBindingPattern *) { return true; }
- virtual void endVisit(ArrayBindingPattern *) {}
-
- virtual bool visit(BindingElement *) { return true; }
- virtual void endVisit(BindingElement *) {}
-
- virtual bool visit(BindingElementList *) { return true; }
- virtual void endVisit(BindingElementList *) {}
-
- virtual bool visit(BindingPropertyList *) { return true; }
- virtual void endVisit(BindingPropertyList *) {}
-
- virtual bool visit(BindingRestElement *) { return true; }
- virtual void endVisit(BindingRestElement *) {}
-
virtual bool visit(FormalParameterList *) { return true; }
virtual void endVisit(FormalParameterList *) {}