diff options
author | davidot <davidot@serenityos.org> | 2021-11-26 21:10:24 +0100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-11-30 17:05:32 +0000 |
commit | e751dcea431518e69ee8efe64ae1b0563ed927e9 (patch) | |
tree | d8e660a10021a8d7e4ede15429ca9233ba84b181 | |
parent | afde1821b5022cb8791e5aa442a56040e190772b (diff) | |
download | serenity-e751dcea431518e69ee8efe64ae1b0563ed927e9.zip |
LibJS: Treat private identifier as divisible token
And also make sure private identifiers are correctly checked when
synthesizing a binding pattern.
-rw-r--r-- | Userland/Libraries/LibJS/Lexer.cpp | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Parser.cpp | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Tests/classes/class-private-fields.js | 13 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Tests/syntax/slash-after-block.js | 1 |
4 files changed, 16 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Lexer.cpp b/Userland/Libraries/LibJS/Lexer.cpp index 30e00eb636..dc70354ed1 100644 --- a/Userland/Libraries/LibJS/Lexer.cpp +++ b/Userland/Libraries/LibJS/Lexer.cpp @@ -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 diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index 04d4e058a2..12478418d2 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -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()) diff --git a/Userland/Libraries/LibJS/Tests/classes/class-private-fields.js b/Userland/Libraries/LibJS/Tests/classes/class-private-fields.js index 06cf102a6d..286019a538 100644 --- a/Userland/Libraries/LibJS/Tests/classes/class-private-fields.js +++ b/Userland/Libraries/LibJS/Tests/classes/class-private-fields.js @@ -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(); }); diff --git a/Userland/Libraries/LibJS/Tests/syntax/slash-after-block.js b/Userland/Libraries/LibJS/Tests/syntax/slash-after-block.js index c3c9771f1a..3fea8feb0a 100644 --- a/Userland/Libraries/LibJS/Tests/syntax/slash-after-block.js +++ b/Userland/Libraries/LibJS/Tests/syntax/slash-after-block.js @@ -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(); |