diff --git a/ets2panda/parser/ASparser.cpp b/ets2panda/parser/ASparser.cpp index d1cc21302d1396f8de16a1f07ebf33b9da17274b..657d56be4d5024c7e531b23fa07402c73aaf440d 100644 --- a/ets2panda/parser/ASparser.cpp +++ b/ets2panda/parser/ASparser.cpp @@ -1351,60 +1351,72 @@ ir::AstNode *ASParser::ParseImportDefaultSpecifier(ArenaVector *s return nullptr; } -// NOLINTNEXTLINE(google-default-arguments) -ir::Expression *ASParser::ParseCoverParenthesizedExpressionAndArrowParameterList( - [[maybe_unused]] ExpressionParseFlags flags) +ir::Expression *ASParser::ParseArrowFunctionRestParameter(lexer::SourcePosition start) { - ASSERT(Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS); - lexer::SourcePosition start = Lexer()->GetToken().Start(); - Lexer()->NextToken(); - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::SpreadElement *restElement = ParseSpreadElement(ExpressionParseFlags::MUST_BE_PATTERN); - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD) { - ir::SpreadElement *restElement = ParseSpreadElement(ExpressionParseFlags::MUST_BE_PATTERN); + restElement->SetGrouped(); + restElement->SetStart(start); - restElement->SetGrouped(); - restElement->SetStart(start); + ValidateArrowFunctionRestParameter(restElement); - ValidateArrowFunctionRestParameter(restElement); + Lexer()->NextToken(); - Lexer()->NextToken(); + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) { + ThrowSyntaxError(":' expected"); + } - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) { - ThrowSyntaxError(":' expected"); - } + Lexer()->NextToken(); // eat ':' - Lexer()->NextToken(); // eat ':' + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::TypeNode *returnTypeAnnotation = ParseTypeAnnotation(&options); - ir::TypeNode *returnTypeAnnotation = ParseTypeAnnotation(&options); + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { + ThrowSyntaxError("'=>' expected"); + } - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { - ThrowSyntaxError("'=>' expected"); - } + return ParseArrowFunctionExpression(restElement, nullptr, returnTypeAnnotation, false); +} + +ir::Expression *ASParser::ParseArrowFunctionNoParameter(lexer::SourcePosition start) +{ + Lexer()->NextToken(); - return ParseArrowFunctionExpression(restElement, nullptr, returnTypeAnnotation, false); + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) { + ThrowSyntaxError(":' expected"); } - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) { - Lexer()->NextToken(); + Lexer()->NextToken(); // eat ':' - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) { - ThrowSyntaxError(":' expected"); - } + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::TypeNode *returnTypeAnnotation = ParseTypeAnnotation(&options); - Lexer()->NextToken(); // eat ':' + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { + ThrowSyntaxError("'=>' expected"); + } - ir::TypeNode *returnTypeAnnotation = ParseTypeAnnotation(&options); + auto *arrowExpr = ParseArrowFunctionExpression(nullptr, nullptr, returnTypeAnnotation, false); + arrowExpr->SetStart(start); + arrowExpr->AsArrowFunctionExpression()->Function()->SetStart(start); - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { - ThrowSyntaxError("'=>' expected"); - } + return arrowExpr; +} + +// NOLINTNEXTLINE(google-default-arguments) +ir::Expression *ASParser::ParseCoverParenthesizedExpressionAndArrowParameterList( + [[maybe_unused]] ExpressionParseFlags flags) +{ + ASSERT(Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS); + lexer::SourcePosition start = Lexer()->GetToken().Start(); + Lexer()->NextToken(); + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; - auto *arrowExpr = ParseArrowFunctionExpression(nullptr, nullptr, returnTypeAnnotation, false); - arrowExpr->SetStart(start); - arrowExpr->AsArrowFunctionExpression()->Function()->SetStart(start); + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD) { + return ParseArrowFunctionRestParameter(start); + } - return arrowExpr; + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) { + return ParseArrowFunctionNoParameter(start); } ir::Expression *expr = ParseExpression(ExpressionParseFlags::ACCEPT_COMMA | ExpressionParseFlags::ACCEPT_REST | diff --git a/ets2panda/parser/ASparser.h b/ets2panda/parser/ASparser.h index 9f1858b5e0f1167008276cda332d93d9c4e07e7c..4a69e8214c7ef750d0fe3109396fa581ea510f4c 100644 --- a/ets2panda/parser/ASparser.h +++ b/ets2panda/parser/ASparser.h @@ -76,6 +76,8 @@ private: // NOLINTNEXTLINE(google-default-arguments) ir::Expression *ParseCoverParenthesizedExpressionAndArrowParameterList( ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override; + ir::Expression *ParseArrowFunctionRestParameter(lexer::SourcePosition start); + ir::Expression *ParseArrowFunctionNoParameter(lexer::SourcePosition start); ir::Expression *ParsePrefixAssertionExpression() override; ir::Statement *ParseConstStatement(StatementParsingFlags flags) override; ir::AnnotatedExpression *ParseVariableDeclaratorKey(VariableParsingFlags flags) override; diff --git a/ets2panda/parser/TSparser.cpp b/ets2panda/parser/TSparser.cpp index 3f299c36d6208f159d50176b4e2d8812ff5db556..fc0ffe75e3c3d56fc6776eb8e830feb394e75dd6 100644 --- a/ets2panda/parser/TSparser.cpp +++ b/ets2panda/parser/TSparser.cpp @@ -2599,56 +2599,68 @@ ir::Statement *TSParser::ParseExportDeclaration(StatementParsingFlags flags) } } -// NOLINTNEXTLINE(google-default-arguments) -ir::Expression *TSParser::ParseCoverParenthesizedExpressionAndArrowParameterList( - [[maybe_unused]] ExpressionParseFlags flags) +ir::Expression *TSParser::ParseArrowFunctionRestParameter(lexer::SourcePosition start) { - ASSERT(Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS); - lexer::SourcePosition start = Lexer()->GetToken().Start(); - Lexer()->NextToken(); - TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::SpreadElement *restElement = ParseSpreadElement(ExpressionParseFlags::MUST_BE_PATTERN); - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD) { - ir::SpreadElement *restElement = ParseSpreadElement(ExpressionParseFlags::MUST_BE_PATTERN); + restElement->SetGrouped(); + restElement->SetStart(start); - restElement->SetGrouped(); - restElement->SetStart(start); + ValidateArrowFunctionRestParameter(restElement); - ValidateArrowFunctionRestParameter(restElement); + Lexer()->NextToken(); - Lexer()->NextToken(); + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::TypeNode *returnTypeAnnotation = nullptr; + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) { + Lexer()->NextToken(); // eat ':' + returnTypeAnnotation = ParseTypeAnnotation(&options); + } - ir::TypeNode *returnTypeAnnotation = nullptr; - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) { - Lexer()->NextToken(); // eat ':' - returnTypeAnnotation = ParseTypeAnnotation(&options); - } + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { + ThrowSyntaxError("Unexpected token"); + } - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { - ThrowSyntaxError("Unexpected token"); - } + return ParseArrowFunctionExpression(restElement, nullptr, returnTypeAnnotation, false); +} + +ir::Expression *TSParser::ParseArrowFunctionNoParameter(lexer::SourcePosition start) +{ + Lexer()->NextToken(); - return ParseArrowFunctionExpression(restElement, nullptr, returnTypeAnnotation, false); + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + ir::TypeNode *returnTypeAnnotation = nullptr; + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) { + Lexer()->NextToken(); // eat ':' + returnTypeAnnotation = ParseTypeAnnotation(&options); } - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) { - Lexer()->NextToken(); + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { + ThrowSyntaxError("Unexpected token"); + } - ir::TypeNode *returnTypeAnnotation = nullptr; - if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) { - Lexer()->NextToken(); // eat ':' - returnTypeAnnotation = ParseTypeAnnotation(&options); - } + auto *arrowExpr = ParseArrowFunctionExpression(nullptr, nullptr, returnTypeAnnotation, false); + arrowExpr->SetStart(start); + arrowExpr->AsArrowFunctionExpression()->Function()->SetStart(start); - if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_ARROW) { - ThrowSyntaxError("Unexpected token"); - } + return arrowExpr; +} - auto *arrowExpr = ParseArrowFunctionExpression(nullptr, nullptr, returnTypeAnnotation, false); - arrowExpr->SetStart(start); - arrowExpr->AsArrowFunctionExpression()->Function()->SetStart(start); +// NOLINTNEXTLINE(google-default-arguments) +ir::Expression *TSParser::ParseCoverParenthesizedExpressionAndArrowParameterList( + [[maybe_unused]] ExpressionParseFlags flags) +{ + ASSERT(Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS); + lexer::SourcePosition start = Lexer()->GetToken().Start(); + Lexer()->NextToken(); + TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::THROW_ERROR; + + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD) { + return ParseArrowFunctionRestParameter(start); + } - return arrowExpr; + if (Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) { + return ParseArrowFunctionNoParameter(start); } ir::Expression *expr = ParseExpression(ExpressionParseFlags::ACCEPT_COMMA | ExpressionParseFlags::ACCEPT_REST | diff --git a/ets2panda/parser/TSparser.h b/ets2panda/parser/TSparser.h index 81b2df71644bdab562d1bddf55570b3bebb2e3e9..76a2dd47cf59630e8cc60a149a3817d2a2309ee8 100644 --- a/ets2panda/parser/TSparser.h +++ b/ets2panda/parser/TSparser.h @@ -125,6 +125,8 @@ private: // NOLINTNEXTLINE(google-default-arguments) ir::Expression *ParseCoverParenthesizedExpressionAndArrowParameterList( ExpressionParseFlags flags = ExpressionParseFlags::NO_OPTS) override; + ir::Expression *ParseArrowFunctionRestParameter(lexer::SourcePosition start); + ir::Expression *ParseArrowFunctionNoParameter(lexer::SourcePosition start); ir::Statement *ParseConstStatement(StatementParsingFlags flags) override; ir::Statement *ParsePotentialConstEnum(VariableParsingFlags flags) override; void ParseCatchParamTypeAnnotation(ir::AnnotatedExpression *param) override;