diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-03-22 16:34:05 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-04-27 08:11:28 +0000 |
commit | 02252ae08dc36ba44f65fb932c428849c7369299 (patch) | |
tree | 5c7627b08cce5bfa2df5e04b3427bcc93ef2b2fe /src/qml/parser | |
parent | e07a03365ad07cd4294f487b15a57f31bd0a3d40 (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.g | 190 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast.cpp | 158 | ||||
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 490 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastfwd_p.h | 17 | ||||
-rw-r--r-- | src/qml/parser/qqmljsastvisitor_p.h | 38 |
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 *) {} |