Просмотр исходного кода

LibJS: Lex private identifiers, identifiers prefixed with a '#'

davidot 3 лет назад
Родитель
Сommit
eeb42c21d1
2 измененных файлов с 24 добавлено и 0 удалено
  1. 23 0
      Userland/Libraries/LibJS/Lexer.cpp
  2. 1 0
      Userland/Libraries/LibJS/Token.h

+ 23 - 0
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

+ 1 - 0
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)                \