1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 22:27:42 +00:00

LibJS: Don't treat '?.' followed by decimal digit as QuestionMarkPeriod

From the spec: https://tc39.es/ecma262/#sec-punctuators

    OptionalChainingPunctuator ::
        ?. [lookahead ∉ DecimalDigit]

We were missing the lookahead and therefore incorrectly treating any
'?.' as TokenType::QuestionMarkPeriod.

Fixes #4409.
This commit is contained in:
Linus Groh 2020-12-14 13:05:24 +00:00 committed by Andreas Kling
parent 6e7edd6e77
commit 0974991d05
2 changed files with 11 additions and 4 deletions

View file

@ -598,10 +598,13 @@ Token Lexer::next()
auto two_chars_view = m_source.substring_view(m_position - 1, 2); auto two_chars_view = m_source.substring_view(m_position - 1, 2);
auto it = s_two_char_tokens.find(two_chars_view.hash(), [&](auto& entry) { return entry.key == two_chars_view; }); auto it = s_two_char_tokens.find(two_chars_view.hash(), [&](auto& entry) { return entry.key == two_chars_view; });
if (it != s_two_char_tokens.end()) { if (it != s_two_char_tokens.end()) {
found_two_char_token = true; // OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit]
consume(); if (!(it->value == TokenType::QuestionMarkPeriod && m_position + 1 < m_source.length() && isdigit(m_source[m_position + 1]))) {
consume(); found_two_char_token = true;
token_type = it->value; consume();
consume();
token_type = it->value;
}
} }
} }

View file

@ -14,3 +14,7 @@ test("object values", () => {
expect(o.f ? true : false).toBeTrue(); expect(o.f ? true : false).toBeTrue();
expect(1 ? o.f : null).toBeTrue(); expect(1 ? o.f : null).toBeTrue();
}); });
test("issue #4409, '?.' followed by decimal digit", () => {
expect("return false?.1:.2").toEvalTo(0.2);
});