mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:47:35 +00:00
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:
parent
8e624c8f6d
commit
b3edd94869
2 changed files with 11 additions and 1 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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"}');
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue