Skip to content

Commit e654f96

Browse files
liviu-gheorgheLiviu Gheorghejakebailey
authored
Allow unescaped paragraph and line separators in string literal (microsoft#53869)
Co-authored-by: Liviu Gheorghe <liviu.gheorghe@ivfuture.uk> Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com>
1 parent e9af22a commit e654f96

5 files changed

+223
-1
lines changed

src/compiler/scanner.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,8 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean
13621362
start = pos;
13631363
continue;
13641364
}
1365-
if (isLineBreak(ch) && !jsxAttributeString) {
1365+
1366+
if ((ch === CharacterCodes.lineFeed || ch === CharacterCodes.carriageReturn) && !jsxAttributeString) {
13661367
result += text.substring(start, pos);
13671368
tokenFlags |= TokenFlags.Unterminated;
13681369
error(Diagnostics.Unterminated_string_literal);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//// [tests/cases/conformance/es2019/allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts] ////
2+
3+
//// [allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts]
4+
// Strings containing unescaped line / paragraph separators
5+
// Using both single quotes, double quotes and template literals
6+
7+
var stringContainingUnescapedLineSeparator1 = "
STRING_CONTENT
";
8+
var stringContainingUnescapedParagraphSeparator1 = "
STRING_CONTENT
";
9+
10+
11+
var stringContainingUnescapedLineSeparator2 = '
STRING_CONTENT
';
12+
var stringContainingUnescapedParagraphSeparator2 = '
STRING_CONTENT
';
13+
14+
15+
var stringContainingUnescapedLineSeparator3 = `
STRING_CONTENT
`;
16+
var stringContainingUnescapedParagraphSeparator3 = `
STRING_CONTENT
`;
17+
18+
// Array of unescaped line / paragraph separators
19+
20+
var arr = [
21+
"

STRING_CONTENT

",
22+
"


STRING_CONTENT


",
23+
"STRING_CONTENT
",
24+
"
STRING_CONTENT",
25+
`\
`,
26+
'
'
27+
];
28+
29+
//// [allowUnescapedParagraphAndLineSeparatorsInStringLiteral.js]
30+
// Strings containing unescaped line / paragraph separators
31+
// Using both single quotes, double quotes and template literals
32+
var stringContainingUnescapedLineSeparator1 = "
STRING_CONTENT
";
33+
var stringContainingUnescapedParagraphSeparator1 = "
STRING_CONTENT
";
34+
var stringContainingUnescapedLineSeparator2 = '
STRING_CONTENT
';
35+
var stringContainingUnescapedParagraphSeparator2 = '
STRING_CONTENT
';
36+
var stringContainingUnescapedLineSeparator3 = "\u2028STRING_CONTENT\u2028";
37+
var stringContainingUnescapedParagraphSeparator3 = "\u2029STRING_CONTENT\u2029";
38+
// Array of unescaped line / paragraph separators
39+
var arr = [
40+
"

STRING_CONTENT

",
41+
"


STRING_CONTENT


",
42+
"STRING_CONTENT
",
43+
"
STRING_CONTENT",
44+
"",
45+
'
'
46+
];
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//// [tests/cases/conformance/es2019/allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts] ////
2+
3+
=== allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts ===
4+
// Strings containing unescaped line / paragraph separators
5+
// Using both single quotes, double quotes and template literals
6+
7+
var stringContainingUnescapedLineSeparator1 = "
8+
>stringContainingUnescapedLineSeparator1 : Symbol(stringContainingUnescapedLineSeparator1, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 3, 3))
9+
10+
STRING_CONTENT
11+
";
12+
var stringContainingUnescapedParagraphSeparator1 = "
13+
>stringContainingUnescapedParagraphSeparator1 : Symbol(stringContainingUnescapedParagraphSeparator1, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 6, 3))
14+
15+
STRING_CONTENT
16+
";
17+
18+
19+
var stringContainingUnescapedLineSeparator2 = '
20+
>stringContainingUnescapedLineSeparator2 : Symbol(stringContainingUnescapedLineSeparator2, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 11, 3))
21+
22+
STRING_CONTENT
23+
';
24+
var stringContainingUnescapedParagraphSeparator2 = '
25+
>stringContainingUnescapedParagraphSeparator2 : Symbol(stringContainingUnescapedParagraphSeparator2, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 14, 3))
26+
27+
STRING_CONTENT
28+
';
29+
30+
31+
var stringContainingUnescapedLineSeparator3 = `
32+
>stringContainingUnescapedLineSeparator3 : Symbol(stringContainingUnescapedLineSeparator3, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 19, 3))
33+
34+
STRING_CONTENT
35+
`;
36+
var stringContainingUnescapedParagraphSeparator3 = `
37+
>stringContainingUnescapedParagraphSeparator3 : Symbol(stringContainingUnescapedParagraphSeparator3, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 22, 3))
38+
39+
STRING_CONTENT
40+
`;
41+
42+
// Array of unescaped line / paragraph separators
43+
44+
var arr = [
45+
>arr : Symbol(arr, Decl(allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts, 28, 3))
46+
47+
"
48+
49+
STRING_CONTENT
50+
51+
",
52+
"
53+
54+
55+
STRING_CONTENT
56+
57+
58+
",
59+
"STRING_CONTENT
60+
",
61+
"
62+
STRING_CONTENT",
63+
`\
64+
`,
65+
'
66+
'
67+
];
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
//// [tests/cases/conformance/es2019/allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts] ////
2+
3+
=== allowUnescapedParagraphAndLineSeparatorsInStringLiteral.ts ===
4+
// Strings containing unescaped line / paragraph separators
5+
// Using both single quotes, double quotes and template literals
6+
7+
var stringContainingUnescapedLineSeparator1 = "
8+
>stringContainingUnescapedLineSeparator1 : string
9+
>"
STRING_CONTENT
" : "\u2028STRING_CONTENT\u2028"
10+
11+
STRING_CONTENT
12+
";
13+
var stringContainingUnescapedParagraphSeparator1 = "
14+
>stringContainingUnescapedParagraphSeparator1 : string
15+
>"
STRING_CONTENT
" : "\u2029STRING_CONTENT\u2029"
16+
17+
STRING_CONTENT
18+
";
19+
20+
21+
var stringContainingUnescapedLineSeparator2 = '
22+
>stringContainingUnescapedLineSeparator2 : string
23+
>'
STRING_CONTENT
' : "\u2028STRING_CONTENT\u2028"
24+
25+
STRING_CONTENT
26+
';
27+
var stringContainingUnescapedParagraphSeparator2 = '
28+
>stringContainingUnescapedParagraphSeparator2 : string
29+
>'
STRING_CONTENT
' : "\u2029STRING_CONTENT\u2029"
30+
31+
STRING_CONTENT
32+
';
33+
34+
35+
var stringContainingUnescapedLineSeparator3 = `
36+
>stringContainingUnescapedLineSeparator3 : string
37+
>`
STRING_CONTENT
` : "\u2028STRING_CONTENT\u2028"
38+
39+
STRING_CONTENT
40+
`;
41+
var stringContainingUnescapedParagraphSeparator3 = `
42+
>stringContainingUnescapedParagraphSeparator3 : string
43+
>`
STRING_CONTENT
` : "\u2029STRING_CONTENT\u2029"
44+
45+
STRING_CONTENT
46+
`;
47+
48+
// Array of unescaped line / paragraph separators
49+
50+
var arr = [
51+
>arr : string[]
52+
>[ "

STRING_CONTENT

", "


STRING_CONTENT


", "STRING_CONTENT
", "
STRING_CONTENT", `\
`, '
'] : string[]
53+
54+
"
55+
>"

STRING_CONTENT

" : "\u2029\u2028STRING_CONTENT\u2028\u2029"
56+
57+
STRING_CONTENT
58+
59+
",
60+
"
61+
>"


STRING_CONTENT


" : "\u2028\u2029\u2029STRING_CONTENT\u2029\u2029\u2028"
62+
63+
64+
STRING_CONTENT
65+
66+
67+
",
68+
"STRING_CONTENT
69+
>"STRING_CONTENT
" : "STRING_CONTENT\u2029"
70+
71+
",
72+
"
73+
>"
STRING_CONTENT" : "\u2028STRING_CONTENT"
74+
75+
STRING_CONTENT",
76+
`\
77+
>`\
` : ""
78+
79+
`,
80+
'
81+
>'
' : "\u2028"
82+
83+
'
84+
];
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Strings containing unescaped line / paragraph separators
2+
// Using both single quotes, double quotes and template literals
3+
4+
var stringContainingUnescapedLineSeparator1 = "
STRING_CONTENT
";
5+
var stringContainingUnescapedParagraphSeparator1 = "
STRING_CONTENT
";
6+
7+
8+
var stringContainingUnescapedLineSeparator2 = '
STRING_CONTENT
';
9+
var stringContainingUnescapedParagraphSeparator2 = '
STRING_CONTENT
';
10+
11+
12+
var stringContainingUnescapedLineSeparator3 = `
STRING_CONTENT
`;
13+
var stringContainingUnescapedParagraphSeparator3 = `
STRING_CONTENT
`;
14+
15+
// Array of unescaped line / paragraph separators
16+
17+
var arr = [
18+
"

STRING_CONTENT

",
19+
"


STRING_CONTENT


",
20+
"STRING_CONTENT
",
21+
"
STRING_CONTENT",
22+
`\
`,
23+
'
'
24+
];

0 commit comments

Comments
 (0)