From 9a6e758b03bd80b9833278c68d4ba651ee486e85 Mon Sep 17 00:00:00 2001 From: Anna Antipina Date: Fri, 19 Jan 2024 11:42:54 +0300 Subject: [PATCH] fix 15345 + 15350 + 15338 https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I8XJTG Signed-off-by: Anna Antipina --- ets2panda/compiler/core/pandagen.cpp | 4 +- ets2panda/parser/ETSparser.cpp | 196 +++++++++++++++------------ ets2panda/parser/ETSparser.h | 8 ++ 3 files changed, 121 insertions(+), 87 deletions(-) diff --git a/ets2panda/compiler/core/pandagen.cpp b/ets2panda/compiler/core/pandagen.cpp index 729bf003ef..647166e11f 100644 --- a/ets2panda/compiler/core/pandagen.cpp +++ b/ets2panda/compiler/core/pandagen.cpp @@ -71,8 +71,8 @@ public: UNREACHABLE(); } - void Transform([[maybe_unused]] pandasm::Ins *ins, [[maybe_unused]] ProgramElement *program_element, - [[maybe_unused]] uint32_t total_regs) const override + void Transform([[maybe_unused]] pandasm::Ins *ins, [[maybe_unused]] ProgramElement *programElement, + [[maybe_unused]] uint32_t totalRegs) const override { UNREACHABLE(); } diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index 0d5eff251f..b470bf883b 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -720,6 +720,96 @@ void ETSParser::ParseTopLevelType(ArenaVector &statements, bool } } +void ETSParser::ParseTopLevelNextTokenDefault(ArenaVector &statements, + ir::ScriptFunction *initFunction, size_t currentPos, + lexer::TokenType tokenType, bool defaultExport) +{ + if (IsStructKeyword()) { + ParseTopLevelType(statements, defaultExport, currentPos, + [](ETSParser *obj) { return obj->ParseTypeDeclaration(false); }); + return; + } + + if (initFunction != nullptr) { + if (auto *const statement = ParseTopLevelStatement(); statement != nullptr) { + statement->SetParent(initFunction->Body()); + initFunction->Body()->AsBlockStatement()->Statements().emplace_back(statement); + } + return; + } + + ThrowUnexpectedToken(tokenType); +} + +ir::ModifierFlags ETSParser::ResolveMemberModifiers() +{ + auto memberModifiers = ir::ModifierFlags::STATIC | ir::ModifierFlags::PUBLIC; + + if (Lexer()->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) { + CheckDeclare(); + memberModifiers |= ir::ModifierFlags::DECLARE; + } + return memberModifiers; +} + +lexer::SourcePosition ETSParser::ParseTopLevelNextTokenResolution(ArenaVector &statements, + ArenaVector &globalProperties, + ir::ScriptFunction *initFunction, size_t currentPos, + bool defaultExport) +{ + lexer::SourcePosition startLoc = Lexer()->GetToken().Start(); + auto memberModifiers = ResolveMemberModifiers(); + + switch (auto const tokenType = Lexer()->GetToken().Type(); tokenType) { + case lexer::TokenType::KEYW_CONST: { + memberModifiers |= ir::ModifierFlags::CONST; + [[fallthrough]]; + } + case lexer::TokenType::KEYW_LET: { + Lexer()->NextToken(); + ParseClassFieldDefinition(ExpectIdentifier(), memberModifiers, &globalProperties, initFunction, &startLoc); + break; + } + case lexer::TokenType::KEYW_ASYNC: + case lexer::TokenType::KEYW_NATIVE: { + ParseTokenOfNative(tokenType, memberModifiers); + [[fallthrough]]; + } + case lexer::TokenType::KEYW_FUNCTION: { + ParseTokenOfFunction(memberModifiers, startLoc, globalProperties); + break; + } + case lexer::TokenType::KEYW_NAMESPACE: + [[fallthrough]]; + case lexer::TokenType::KEYW_STATIC: + [[fallthrough]]; + case lexer::TokenType::KEYW_ABSTRACT: + [[fallthrough]]; + case lexer::TokenType::KEYW_FINAL: + [[fallthrough]]; + case lexer::TokenType::KEYW_ENUM: + [[fallthrough]]; + case lexer::TokenType::KEYW_INTERFACE: + [[fallthrough]]; + case lexer::TokenType::KEYW_CLASS: { + // NOLINTBEGIN(modernize-avoid-bind) + ParseTopLevelType(statements, defaultExport, currentPos, + std::bind(&ETSParser::ParseTypeDeclaration, std::placeholders::_1, false)); + // NOLINTEND(modernize-avoid-bind) + break; + } + case lexer::TokenType::KEYW_TYPE: { + ParseTopLevelType(statements, defaultExport, currentPos, &ETSParser::ParseTypeAliasDeclaration); + break; + } + default: { + // If struct is a soft keyword, handle it here, otherwise it's an identifier. + ParseTopLevelNextTokenDefault(statements, initFunction, currentPos, tokenType, defaultExport); + } + } + return startLoc; +} + void ETSParser::ParseTopLevelNextToken(ArenaVector &statements, ArenaVector &globalProperties, ir::ScriptFunction *initFunction) { @@ -748,77 +838,8 @@ void ETSParser::ParseTopLevelNextToken(ArenaVector &statements, } } - lexer::SourcePosition startLoc = Lexer()->GetToken().Start(); - - auto memberModifiers = ir::ModifierFlags::STATIC | ir::ModifierFlags::PUBLIC; - - if (Lexer()->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) { - CheckDeclare(); - memberModifiers |= ir::ModifierFlags::DECLARE; - } - - switch (auto const tokenType = Lexer()->GetToken().Type(); tokenType) { - case lexer::TokenType::KEYW_CONST: { - memberModifiers |= ir::ModifierFlags::CONST; - [[fallthrough]]; - } - case lexer::TokenType::KEYW_LET: { - Lexer()->NextToken(); - auto *memberName = ExpectIdentifier(); - ParseClassFieldDefinition(memberName, memberModifiers, &globalProperties, initFunction, &startLoc); - break; - } - case lexer::TokenType::KEYW_ASYNC: - case lexer::TokenType::KEYW_NATIVE: { - ParseTokenOfNative(tokenType, memberModifiers); - [[fallthrough]]; - } - case lexer::TokenType::KEYW_FUNCTION: { - ParseTokenOfFunction(memberModifiers, startLoc, globalProperties); - break; - } - case lexer::TokenType::KEYW_NAMESPACE: - [[fallthrough]]; - case lexer::TokenType::KEYW_STATIC: - [[fallthrough]]; - case lexer::TokenType::KEYW_ABSTRACT: - [[fallthrough]]; - case lexer::TokenType::KEYW_FINAL: - [[fallthrough]]; - case lexer::TokenType::KEYW_ENUM: - [[fallthrough]]; - case lexer::TokenType::KEYW_INTERFACE: - [[fallthrough]]; - case lexer::TokenType::KEYW_CLASS: { - // NOLINTBEGIN(modernize-avoid-bind) - ParseTopLevelType(statements, defaultExport, currentPos, - std::bind(&ETSParser::ParseTypeDeclaration, std::placeholders::_1, false)); - // NOLINTEND(modernize-avoid-bind) - break; - } - case lexer::TokenType::KEYW_TYPE: { - ParseTopLevelType(statements, defaultExport, currentPos, &ETSParser::ParseTypeAliasDeclaration); - break; - } - default: { - // If struct is a soft keyword, handle it here, otherwise it's an identifier. - if (IsStructKeyword()) { - ParseTopLevelType(statements, defaultExport, currentPos, - [](ETSParser *obj) { return obj->ParseTypeDeclaration(false); }); - break; - } - - if (initFunction != nullptr) { - if (auto *const statement = ParseTopLevelStatement(); statement != nullptr) { - statement->SetParent(initFunction->Body()); - initFunction->Body()->AsBlockStatement()->Statements().emplace_back(statement); - } - break; - } - - ThrowUnexpectedToken(tokenType); - } - } + lexer::SourcePosition startLoc = + ParseTopLevelNextTokenResolution(statements, globalProperties, initFunction, currentPos, defaultExport); GetContext().Status() &= ~ParserStatus::IN_AMBIENT_CONTEXT; @@ -1732,6 +1753,24 @@ ir::MethodDefinition *ETSParser::ParseInterfaceGetterSetterMethod(const ir::Modi return method; } +ir::Statement *ETSParser::ParseTypeDeclarationAbstractFinal(bool allowStatic, ir::ClassDefinitionModifiers modifiers) +{ + auto flags = ParseClassModifiers(); + if (allowStatic && (flags & ir::ModifierFlags::STATIC) == 0U) { + modifiers |= ir::ClassDefinitionModifiers::INNER; + } + + if (Lexer()->GetToken().Type() == lexer::TokenType::KEYW_CLASS) { + return ParseClassDeclaration(modifiers, flags); + } + + if (IsStructKeyword()) { + return ParseStructDeclaration(modifiers, flags); + } + + ThrowUnexpectedToken(Lexer()->GetToken().Type()); +} + ir::Statement *ETSParser::ParseTypeDeclaration(bool allowStatic) { auto savedPos = Lexer()->Save(); @@ -1756,20 +1795,7 @@ ir::Statement *ETSParser::ParseTypeDeclaration(bool allowStatic) } case lexer::TokenType::KEYW_ABSTRACT: case lexer::TokenType::KEYW_FINAL: { - auto flags = ParseClassModifiers(); - if (allowStatic && (flags & ir::ModifierFlags::STATIC) == 0U) { - modifiers |= ir::ClassDefinitionModifiers::INNER; - } - - if (Lexer()->GetToken().Type() == lexer::TokenType::KEYW_CLASS) { - return ParseClassDeclaration(modifiers, flags); - } - - if (IsStructKeyword()) { - return ParseStructDeclaration(modifiers, flags); - } - - ThrowUnexpectedToken(Lexer()->GetToken().Type()); + return ParseTypeDeclarationAbstractFinal(allowStatic, modifiers); } case lexer::TokenType::KEYW_ENUM: { return ParseEnumDeclaration(false); diff --git a/ets2panda/parser/ETSparser.h b/ets2panda/parser/ETSparser.h index c271015998..24addaa102 100644 --- a/ets2panda/parser/ETSparser.h +++ b/ets2panda/parser/ETSparser.h @@ -110,6 +110,13 @@ private: std::function const &parserFunction); void ParseTopLevelNextToken(ArenaVector &statements, ArenaVector &globalProperties, ir::ScriptFunction *initFunction); + void ParseTopLevelNextTokenDefault(ArenaVector &statements, ir::ScriptFunction *initFunction, + size_t currentPos, lexer::TokenType tokenType, bool defaultExport); + ir::ModifierFlags ResolveMemberModifiers(); + lexer::SourcePosition ParseTopLevelNextTokenResolution(ArenaVector &statements, + ArenaVector &globalProperties, + ir::ScriptFunction *initFunction, size_t currentPos, + bool defaultExport); void ParseTokenOfNative(panda::es2panda::lexer::TokenType tokenType, ir::ModifierFlags &memberModifiers); void ParseTokenOfFunction(ir::ModifierFlags memberModifiers, lexer::SourcePosition startLoc, ArenaVector &globalProperties); @@ -144,6 +151,7 @@ private: ir::ModifierFlags memberModifiers); ir::MethodDefinition *ParseInterfaceGetterSetterMethod(ir::ModifierFlags modifiers); ir::Statement *ParseTypeDeclaration(bool allowStatic = false); + ir::Statement *ParseTypeDeclarationAbstractFinal(bool allowStatic, ir::ClassDefinitionModifiers modifiers); ir::ModifierFlags ParseClassModifiers(); ir::ModifierFlags ParseInterfaceMethodModifiers(); ir::ClassProperty *ParseInterfaceField(); -- Gitee