From eeb42c21d19c30ed0d60790bfa27ca231012d3a9 Mon Sep 17 00:00:00 2001 From: davidot Date: Fri, 8 Oct 2021 00:39:17 +0200 Subject: [PATCH] LibJS: Lex private identifiers, identifiers prefixed with a '#' --- Userland/Libraries/LibJS/Lexer.cpp | 23 +++++++++++++++++++++++ Userland/Libraries/LibJS/Token.h | 1 + 2 files changed, 24 insertions(+) diff --git a/Userland/Libraries/LibJS/Lexer.cpp b/Userland/Libraries/LibJS/Lexer.cpp index cd7df4816b..b46f5daa83 100644 --- a/Userland/Libraries/LibJS/Lexer.cpp +++ b/Userland/Libraries/LibJS/Lexer.cpp @@ -600,6 +600,29 @@ Token Lexer::next() else token_type = TokenType::TemplateLiteralString; } + } else if (m_current_char == '#') { + // Note: This has some duplicated code with the identifier lexing below + consume(); + auto code_point = is_identifier_start(identifier_length); + if (code_point.has_value()) { + StringBuilder builder; + builder.append_code_point('#'); + do { + builder.append_code_point(*code_point); + for (size_t i = 0; i < identifier_length; ++i) + consume(); + + code_point = is_identifier_middle(identifier_length); + } while (code_point.has_value()); + + identifier = builder.string_view(); + token_type = TokenType::PrivateIdentifier; + + m_parsed_identifiers->identifiers.set(*identifier); + } else { + token_type = TokenType::Invalid; + token_message = "Start of private name '#' but not followed by valid identifier"; + } } else if (auto code_point = is_identifier_start(identifier_length); code_point.has_value()) { bool has_escaped_character = false; // identifier or keyword diff --git a/Userland/Libraries/LibJS/Token.h b/Userland/Libraries/LibJS/Token.h index 2e74847de1..36c2e048e8 100644 --- a/Userland/Libraries/LibJS/Token.h +++ b/Userland/Libraries/LibJS/Token.h @@ -117,6 +117,7 @@ constexpr const u32 ZERO_WIDTH_JOINER { 0x200D }; __ENUMERATE_JS_TOKEN(PlusEquals, Operator) \ __ENUMERATE_JS_TOKEN(PlusPlus, Operator) \ __ENUMERATE_JS_TOKEN(Private, Keyword) \ + __ENUMERATE_JS_TOKEN(PrivateIdentifier, Identifier) \ __ENUMERATE_JS_TOKEN(Protected, Keyword) \ __ENUMERATE_JS_TOKEN(Public, Keyword) \ __ENUMERATE_JS_TOKEN(QuestionMark, Operator) \