diff --git a/ets2panda/es2panda.h b/ets2panda/es2panda.h index b7e93a6cbdfdccd79d8f1575898297d78211e8cb..9b69010cf70ee3cf64fbcd98691dd9722f2d18d7 100644 --- a/ets2panda/es2panda.h +++ b/ets2panda/es2panda.h @@ -94,6 +94,7 @@ struct SourceFile { bool isModule {}; // NOTE(dkofanov): Should be aligned with 'Program::moduleInfo_'. bool isDeclForDynamicStaticInterop {}; + bool isExternalSourceImport {}; std::string_view dest {}; // NOLINTEND(misc-non-private-member-variables-in-classes) }; diff --git a/ets2panda/lexer/ETSLexer.cpp b/ets2panda/lexer/ETSLexer.cpp index 09ebb112982d974fccde8a068a795a75092bab36..bc0330997c2783c43c23cc60011ef620b055369e 100644 --- a/ets2panda/lexer/ETSLexer.cpp +++ b/ets2panda/lexer/ETSLexer.cpp @@ -20,6 +20,7 @@ namespace ark::es2panda::lexer { // NOLINTNEXTLINE(google-default-arguments) void ETSLexer::NextToken(NextTokenFlags flags) { + flags |= DefaultNextTokenFlags(); ETSKeywords kws(this, static_cast(flags & ~NextTokenFlags::KEYWORD_TO_IDENT)); Lexer::NextToken(&kws); } diff --git a/ets2panda/lexer/keywordsUtil.cpp b/ets2panda/lexer/keywordsUtil.cpp index f3bdff0a97c7bfff47e270c1a40b79abe5676fac..1614d719d32220f31ca13c69235b79db6539e651 100644 --- a/ets2panda/lexer/keywordsUtil.cpp +++ b/ets2panda/lexer/keywordsUtil.cpp @@ -231,7 +231,8 @@ void KeywordsUtil::ScanIdContinue() size_t cpSize {}; auto cp = Iterator().PeekCp(&cpSize); - if (!IsIdentifierPart(cp)) { + if (!IsIdentifierPart(cp) && + (cp != LEX_CHAR_PERCENT || (Flags() & NextTokenFlags::CHAR_PERCENT_ALLOWED) == 0)) { break; } diff --git a/ets2panda/lexer/lexer.h b/ets2panda/lexer/lexer.h index 4f5031912247c98c12da9f312d5cb32d3056afc7..464dd2a0e64e47ff388391efaea2b3cc5dc14ffc 100644 --- a/ets2panda/lexer/lexer.h +++ b/ets2panda/lexer/lexer.h @@ -40,6 +40,7 @@ enum class NextTokenFlags : uint32_t { NUMERIC_SEPARATOR_ALLOWED = 1U << 1U, BIGINT_ALLOWED = 1U << 2U, UNARY_MINUS = 1U << 3U, + CHAR_PERCENT_ALLOWED = 1U << 4U, }; class LexerPosition { @@ -269,6 +270,16 @@ public: return GetToken().Start(); } + NextTokenFlags DefaultNextTokenFlags() const + { + return defaultNextTokenFlags; + } + + void SetDefaultNextTokenFlags(NextTokenFlags flags) + { + defaultNextTokenFlags = flags; + } + protected: void NextToken(Keywords *kws); ArenaAllocator *Allocator(); @@ -377,11 +388,11 @@ protected: private: TemplateLiteralParserContext *tlCtx_ {}; ArenaAllocator *allocator_; - Keywords *kws_ {}; const parser::ParserContext *parserContext_; util::StringView source_; LexerPosition pos_; util::DiagnosticEngine &diagnosticEngine_; + NextTokenFlags defaultNextTokenFlags = NextTokenFlags::NONE; }; class TemplateLiteralParserContext { diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index d6c04b52feca3475996e137338f2d1570b3ad15a..edc97d8ffb091b48e64c1b7714aea939708265f9 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -108,6 +108,9 @@ std::unique_ptr ETSParser::InitLexer(const SourceFile &sourceFile) { GetProgram()->SetSource(sourceFile); auto lexer = std::make_unique(&GetContext(), DiagnosticEngine()); + if (sourceFile.isExternalSourceImport) { + lexer->SetDefaultNextTokenFlags(lexer::NextTokenFlags::CHAR_PERCENT_ALLOWED); + } SetLexer(lexer.get()); return lexer; } @@ -314,6 +317,7 @@ void ETSParser::ParseParseListElement(const util::ImportPathManager::ParseInfo & auto src = importData.HasSpecifiedDeclPath() ? importData.declPath : importData.resolvedSource; ES2PANDA_ASSERT(!extSrc.empty()); SourceFile sf {src, extSrc, importData.resolvedSource, false, importData.HasSpecifiedDeclPath()}; + sf.isExternalSourceImport = importData.IsExternalSourceImport(); parser::Program *newProg = ParseSource(sf); ES2PANDA_ASSERT(newProg != nullptr); if (!importData.IsImplicitPackageImported() || newProg->IsPackage()) {