1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 21:08:12 +00:00

LibJS: Treat private identifier as divisible token

And also make sure private identifiers are correctly checked when
synthesizing a binding pattern.
This commit is contained in:
davidot 2021-11-26 21:10:24 +01:00 committed by Linus Groh
parent afde1821b5
commit e751dcea43
4 changed files with 16 additions and 0 deletions

View file

@ -498,6 +498,7 @@ bool Lexer::slash_means_division() const
|| type == TokenType::NumericLiteral
|| type == TokenType::ParenClose
|| type == TokenType::PlusPlus
|| type == TokenType::PrivateIdentifier
|| type == TokenType::RegexLiteral
|| type == TokenType::StringLiteral
|| type == TokenType::TemplateLiteralEnd

View file

@ -1989,6 +1989,7 @@ RefPtr<BindingPattern> Parser::synthesize_binding_pattern(Expression const& expr
parser.m_state.string_legacy_octal_escape_sequence_in_scope = m_state.string_legacy_octal_escape_sequence_in_scope;
parser.m_state.in_class_field_initializer = m_state.in_class_field_initializer;
parser.m_state.in_class_static_init_block = m_state.in_class_static_init_block;
parser.m_state.referenced_private_names = m_state.referenced_private_names;
auto result = parser.parse_binding_pattern(AllowDuplicates::Yes, AllowMemberExpressions::Yes);
if (parser.has_errors())

View file

@ -83,6 +83,19 @@ test("static fields", () => {
expect("A.#simple").not.toEval();
});
test("slash after private identifier is treated as division", () => {
class A {
static #field = 4;
static #divided = this.#field / 2;
static getDivided() {
return this.#divided;
}
}
expect(A.getDivided()).toBe(2);
});
test("cannot have static and non static field with the same description", () => {
expect("class A { static #simple; #simple; }").not.toEval();
});

View file

@ -17,6 +17,7 @@ test("slash token resolution in lexer", () => {
expect("+a-- / 1").toEval();
expect("a.in / b").toEval();
expect("a.instanceof / b").toEval();
expect("class A { #name; d = a.#name / b; }").toEval();
// FIXME: Even more 'reserved' words are valid however the cases below do still need to pass.
//expect("a.void / b").toEval();