LibJS: Treat '\\' as an escaped character in template literals

Before this change we would ignore that the second backslash is escaped
and template strings ending with ` \\` would be unterminated as the
second slash was used to escape the closing quote.
This commit is contained in:
davidot 2022-11-14 21:52:58 +01:00 committed by Linus Groh
parent 8e624c8f6d
commit b3edd94869
Notes: sideshowbarker 2024-07-17 04:27:29 +09:00
2 changed files with 11 additions and 1 deletions

View file

@ -610,8 +610,15 @@ Token Lexer::next()
consume();
m_template_states.last().in_expr = true;
} else {
// TemplateCharacter ::
// $ [lookahead ≠ {]
// \ TemplateEscapeSequence
// \ NotEscapeSequence
// LineContinuation
// LineTerminatorSequence
// SourceCharacter but not one of ` or \ or $ or LineTerminator
while (!match('$', '{') && m_current_char != '`' && !is_eof()) {
if (match('\\', '$') || match('\\', '`'))
if (match('\\', '$') || match('\\', '`') || match('\\', '\\'))
consume();
consume();
}

View file

@ -7,6 +7,9 @@ test("plain literals with expression-like characters", () => {
test("plain literals with escaped special characters", () => {
expect(`foo\``).toBe("foo`");
expect(`foo\\`).toBe("foo\\");
expect(`foo\\\``).toBe("foo\\`");
expect(`foo\\\\`).toBe("foo\\\\");
expect(`foo\$`).toBe("foo$");
expect(`foo \${"bar"}`).toBe('foo ${"bar"}');
});