From bbe2988e8fcd8f9a90fe8ef72a9bf2087639e3eb Mon Sep 17 00:00:00 2001 From: Iwan Date: Wed, 26 Aug 2020 11:20:43 +0200 Subject: [PATCH] escape LineTerminator in escape sequences template literal characters Interprets escape sequences in template characters as specified in: https://tc39.es/ecma262/#prod-TemplateCharacter The "LineTerminator" is part of "NonEscapeCharacter" in a "EscapeSequence" --- .depend | 3 ++- src/res_character_codes.ml | 2 +- src/res_core.ml | 2 ++ src/res_scanner.ml | 1 + tests/conversion/reason/__snapshots__/render.spec.js.snap | 3 +++ tests/conversion/reason/string.re | 3 +++ 6 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.depend b/.depend index cbafae95..c2098132 100644 --- a/.depend +++ b/.depend @@ -13,7 +13,8 @@ src/res_comments_table.cmx : src/res_parsetree_viewer.cmx src/res_doc.cmx \ src/res_comment.cmx src/res_core.cmx : src/res_token.cmx src/res_scanner.cmx src/res_printer.cmx \ src/res_parser.cmx src/res_js_ffi.cmx src/res_grammar.cmx src/res_doc.cmx \ - src/res_diagnostics.cmx src/res_comments_table.cmx src/res_core.cmi + src/res_diagnostics.cmx src/res_comments_table.cmx \ + src/res_character_codes.cmx src/res_core.cmi src/res_core.cmi : src/res_parser.cmi src/res_diagnostics.cmx : src/res_token.cmx src/res_grammar.cmx \ src/res_diagnostics_printing_utils.cmx src/res_diagnostics.cmi diff --git a/src/res_character_codes.ml b/src/res_character_codes.ml index 5de247c5..aec713a7 100644 --- a/src/res_character_codes.ml +++ b/src/res_character_codes.ml @@ -157,4 +157,4 @@ let digitValue ch = else if Lower.a <= (lower ch) && (lower ch) <= Lower.f then (lower ch) - Lower.a + 10 else - 16 (* larger than any legal value *) \ No newline at end of file + 16 (* larger than any legal value *) diff --git a/src/res_core.ml b/src/res_core.ml index eac92f8a..ed08600a 100644 --- a/src/res_core.ml +++ b/src/res_core.ml @@ -838,6 +838,8 @@ let parseTemplateStringLiteral s = | '`' as c -> Buffer.add_char b c; loop (i + 2) + | c when Res_character_codes.isLineBreak (Char.code c) -> + loop (i + 2) | c -> Buffer.add_char b '\\'; Buffer.add_char b c; diff --git a/src/res_scanner.ml b/src/res_scanner.ml index e58be9c5..fd1359a8 100644 --- a/src/res_scanner.ml +++ b/src/res_scanner.ml @@ -432,6 +432,7 @@ let scanTemplateLiteralToken scanner = if scanner.ch == CharacterCodes.backtick || scanner.ch == CharacterCodes.backslash || scanner.ch == CharacterCodes.dollar + || CharacterCodes.isLineBreak scanner.ch then next scanner; scan() ) else ( diff --git a/tests/conversion/reason/__snapshots__/render.spec.js.snap b/tests/conversion/reason/__snapshots__/render.spec.js.snap index 977e58e1..2cf44bf5 100644 --- a/tests/conversion/reason/__snapshots__/render.spec.js.snap +++ b/tests/conversion/reason/__snapshots__/render.spec.js.snap @@ -1276,6 +1276,9 @@ let x = 1 exports[`string.re 1`] = ` "%%bs.raw(\\"define(x.y, 'userAgent', {value: 'USER_AGENT_STRING'})\\") + +let x = \`This is a long string with a slash and line break \\\\\\\\ +carriage return\` " `; diff --git a/tests/conversion/reason/string.re b/tests/conversion/reason/string.re index de651235..63bb3b60 100644 --- a/tests/conversion/reason/string.re +++ b/tests/conversion/reason/string.re @@ -1,2 +1,5 @@ %bs.raw "define(x.y, 'userAgent', {value: 'USER_AGENT_STRING'})"; + +let x = {js|This is a long string with a slash and line break \ +carriage return|js}