Skip to content

Commit 6ef797f

Browse files
committed
rename file and improve comment and tests
1 parent 344d505 commit 6ef797f

File tree

6 files changed

+300
-8
lines changed

6 files changed

+300
-8
lines changed

src/compiler/scanner.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,8 @@ namespace ts {
11441144
pos++;
11451145
switch (ch) {
11461146
case CharacterCodes._0:
1147-
if (isTaggedTemplate && isDigit(text.charCodeAt(pos))) {
1147+
// '\01'
1148+
if (isTaggedTemplate && pos < end && isDigit(text.charCodeAt(pos))) {
11481149
pos++;
11491150
tokenFlags |= TokenFlags.NotEscape;
11501151
return text.substring(start, pos);
@@ -1168,11 +1169,13 @@ namespace ts {
11681169
return "\"";
11691170
case CharacterCodes.u:
11701171
if (isTaggedTemplate) {
1172+
// '\u'
11711173
if (pos < end && !isHexDigit(text.charCodeAt(pos)) && text.charCodeAt(pos) !== CharacterCodes.openBrace) {
11721174
tokenFlags |= TokenFlags.NotEscape;
1173-
return "u";
1175+
return text.substring(start, pos);
11741176
}
11751177

1178+
// '\u0' or '\u00' or '\u000'
11761179
for (let i = 0; i < 3; i++) {
11771180
if (pos + i + 1 < end && isHexDigit(text.charCodeAt(pos + i)) && !isHexDigit(text.charCodeAt(pos + i + 1)) && text.charCodeAt(pos + i + 1) !== CharacterCodes.openBrace) {
11781181
pos += i;
@@ -1185,13 +1188,15 @@ namespace ts {
11851188
if (pos < end && text.charCodeAt(pos) === CharacterCodes.openBrace) {
11861189
pos++;
11871190

1191+
// '\u{'
11881192
if (isTaggedTemplate && !isHexDigit(text.charCodeAt(pos))) {
11891193
tokenFlags |= TokenFlags.NotEscape;
1190-
return "u{";
1194+
return text.substring(start, pos);
11911195
}
11921196

11931197
const escapedValue = scanMinimumNumberOfHexDigits(1, /*canHaveSeparators*/ false);
11941198
if (isTaggedTemplate) {
1199+
// '\u{Not Code Point' or '\u{CodePoint'
11951200
if (!isCodePoint(escapedValue) || text.charCodeAt(pos) !== CharacterCodes.closeBrace) {
11961201
tokenFlags |= TokenFlags.NotEscape;
11971202
return text.substring(start, pos);
@@ -1208,12 +1213,12 @@ namespace ts {
12081213
if (isTaggedTemplate) {
12091214
if (!isHexDigit(text.charCodeAt(pos))) {
12101215
tokenFlags |= TokenFlags.NotEscape;
1211-
return "x";
1216+
return text.substring(start, pos);
12121217
}
12131218
else if (!isHexDigit(text.charCodeAt(pos + 1))) {
12141219
pos++;
12151220
tokenFlags |= TokenFlags.NotEscape;
1216-
return "x" + String.fromCharCode(text.charCodeAt(pos));
1221+
return text.substring(start, pos);
12171222
}
12181223
}
12191224
// '\xDD'
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts(5,18): error TS1125: Hexadecimal digit expected.
2+
tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts(6,15): error TS1125: Hexadecimal digit expected.
3+
tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts(6,33): error TS1125: Hexadecimal digit expected.
4+
tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts(6,75): error TS1125: Hexadecimal digit expected.
5+
6+
7+
==== tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts (4 errors) ====
8+
function tag (str: any, ...args: any[]): string {
9+
return str
10+
}
11+
12+
const x = tag`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
13+
14+
!!! error TS1125: Hexadecimal digit expected.
15+
const y = `\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
16+
17+
!!! error TS1125: Hexadecimal digit expected.
18+
19+
!!! error TS1125: Hexadecimal digit expected.
20+
21+
!!! error TS1125: Hexadecimal digit expected.
22+
23+
const a1 = tag`${ 100 }\0` // \0
24+
const a2 = tag`${ 100 }\00` // \\00
25+
const a3 = tag`${ 100 }\u` // \\u
26+
const a4 = tag`${ 100 }\u0` // \\u0
27+
const a5 = tag`${ 100 }\u00` // \\u00
28+
const a6 = tag`${ 100 }\u000` // \\u000
29+
const a7 = tag`${ 100 }\u0000` // \u0000
30+
const a8 = tag`${ 100 }\u{` // \\u{
31+
const a9 = tag`${ 100 }\u{10FFFF}` // \\u{10FFFF
32+
const a10 = tag`${ 100 }\u{1f622` // \\u{1f622
33+
const a11 = tag`${ 100 }\u{1f622}` // \u{1f622}
34+
const a12 = tag`${ 100 }\x` // \\x
35+
const a13 = tag`${ 100 }\x0` // \\x0
36+
const a14 = tag`${ 100 }\x00` // \x00
37+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//// [invalidTaggedTemplateEscapeSequences.ts]
2+
function tag (str: any, ...args: any[]): string {
3+
return str
4+
}
5+
6+
const x = tag`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
7+
const y = `\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
8+
9+
const a1 = tag`${ 100 }\0` // \0
10+
const a2 = tag`${ 100 }\00` // \\00
11+
const a3 = tag`${ 100 }\u` // \\u
12+
const a4 = tag`${ 100 }\u0` // \\u0
13+
const a5 = tag`${ 100 }\u00` // \\u00
14+
const a6 = tag`${ 100 }\u000` // \\u000
15+
const a7 = tag`${ 100 }\u0000` // \u0000
16+
const a8 = tag`${ 100 }\u{` // \\u{
17+
const a9 = tag`${ 100 }\u{10FFFF}` // \\u{10FFFF
18+
const a10 = tag`${ 100 }\u{1f622` // \\u{1f622
19+
const a11 = tag`${ 100 }\u{1f622}` // \u{1f622}
20+
const a12 = tag`${ 100 }\x` // \\x
21+
const a13 = tag`${ 100 }\x0` // \\x0
22+
const a14 = tag`${ 100 }\x00` // \x00
23+
24+
25+
//// [invalidTaggedTemplateEscapeSequences.js]
26+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
27+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
28+
return cooked;
29+
};
30+
function tag(str) {
31+
var args = [];
32+
for (var _i = 1; _i < arguments.length; _i++) {
33+
args[_i - 1] = arguments[_i];
34+
}
35+
return str;
36+
}
37+
var x = tag(__makeTemplateObject([undefined, undefined, " wonderful ", undefined], ["\\u{hello} ", " \\xtraordinary ", " wonderful ", " \\uworld"]), 100, 200, 300);
38+
var y = "hello} " + 100 + " traordinary " + 200 + " wonderful " + 300 + " world";
39+
var a1 = tag(__makeTemplateObject(["", "\0"], ["", "\\0"]), 100); // \0
40+
var a2 = tag(__makeTemplateObject(["", undefined], ["", "\\00"]), 100); // \\00
41+
var a3 = tag(__makeTemplateObject(["", undefined], ["", "\\u"]), 100); // \\u
42+
var a4 = tag(__makeTemplateObject(["", undefined], ["", "\\u0"]), 100); // \\u0
43+
var a5 = tag(__makeTemplateObject(["", undefined], ["", "\\u00"]), 100); // \\u00
44+
var a6 = tag(__makeTemplateObject(["", undefined], ["", "\\u000"]), 100); // \\u000
45+
var a7 = tag(__makeTemplateObject(["", "\0"], ["", "\\u0000"]), 100); // \u0000
46+
var a8 = tag(__makeTemplateObject(["", undefined], ["", "\\u{"]), 100); // \\u{
47+
var a9 = tag(__makeTemplateObject(["", "\uDBFF\uDFFF"], ["", "\\u{10FFFF}"]), 100); // \\u{10FFFF
48+
var a10 = tag(__makeTemplateObject(["", undefined], ["", "\\u{1f622"]), 100); // \\u{1f622
49+
var a11 = tag(__makeTemplateObject(["", "\uD83D\uDE22"], ["", "\\u{1f622}"]), 100); // \u{1f622}
50+
var a12 = tag(__makeTemplateObject(["", undefined], ["", "\\x"]), 100); // \\x
51+
var a13 = tag(__makeTemplateObject(["", undefined], ["", "\\x0"]), 100); // \\x0
52+
var a14 = tag(__makeTemplateObject(["", "\0"], ["", "\\x00"]), 100); // \x00
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts ===
2+
function tag (str: any, ...args: any[]): string {
3+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
4+
>str : Symbol(str, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 14))
5+
>args : Symbol(args, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 23))
6+
7+
return str
8+
>str : Symbol(str, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 14))
9+
}
10+
11+
const x = tag`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
12+
>x : Symbol(x, Decl(invalidTaggedTemplateEscapeSequences.ts, 4, 5))
13+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
14+
15+
const y = `\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
16+
>y : Symbol(y, Decl(invalidTaggedTemplateEscapeSequences.ts, 5, 5))
17+
18+
const a1 = tag`${ 100 }\0` // \0
19+
>a1 : Symbol(a1, Decl(invalidTaggedTemplateEscapeSequences.ts, 7, 5))
20+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
21+
22+
const a2 = tag`${ 100 }\00` // \\00
23+
>a2 : Symbol(a2, Decl(invalidTaggedTemplateEscapeSequences.ts, 8, 5))
24+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
25+
26+
const a3 = tag`${ 100 }\u` // \\u
27+
>a3 : Symbol(a3, Decl(invalidTaggedTemplateEscapeSequences.ts, 9, 5))
28+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
29+
30+
const a4 = tag`${ 100 }\u0` // \\u0
31+
>a4 : Symbol(a4, Decl(invalidTaggedTemplateEscapeSequences.ts, 10, 5))
32+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
33+
34+
const a5 = tag`${ 100 }\u00` // \\u00
35+
>a5 : Symbol(a5, Decl(invalidTaggedTemplateEscapeSequences.ts, 11, 5))
36+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
37+
38+
const a6 = tag`${ 100 }\u000` // \\u000
39+
>a6 : Symbol(a6, Decl(invalidTaggedTemplateEscapeSequences.ts, 12, 5))
40+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
41+
42+
const a7 = tag`${ 100 }\u0000` // \u0000
43+
>a7 : Symbol(a7, Decl(invalidTaggedTemplateEscapeSequences.ts, 13, 5))
44+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
45+
46+
const a8 = tag`${ 100 }\u{` // \\u{
47+
>a8 : Symbol(a8, Decl(invalidTaggedTemplateEscapeSequences.ts, 14, 5))
48+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
49+
50+
const a9 = tag`${ 100 }\u{10FFFF}` // \\u{10FFFF
51+
>a9 : Symbol(a9, Decl(invalidTaggedTemplateEscapeSequences.ts, 15, 5))
52+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
53+
54+
const a10 = tag`${ 100 }\u{1f622` // \\u{1f622
55+
>a10 : Symbol(a10, Decl(invalidTaggedTemplateEscapeSequences.ts, 16, 5))
56+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
57+
58+
const a11 = tag`${ 100 }\u{1f622}` // \u{1f622}
59+
>a11 : Symbol(a11, Decl(invalidTaggedTemplateEscapeSequences.ts, 17, 5))
60+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
61+
62+
const a12 = tag`${ 100 }\x` // \\x
63+
>a12 : Symbol(a12, Decl(invalidTaggedTemplateEscapeSequences.ts, 18, 5))
64+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
65+
66+
const a13 = tag`${ 100 }\x0` // \\x0
67+
>a13 : Symbol(a13, Decl(invalidTaggedTemplateEscapeSequences.ts, 19, 5))
68+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
69+
70+
const a14 = tag`${ 100 }\x00` // \x00
71+
>a14 : Symbol(a14, Decl(invalidTaggedTemplateEscapeSequences.ts, 20, 5))
72+
>tag : Symbol(tag, Decl(invalidTaggedTemplateEscapeSequences.ts, 0, 0))
73+
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
=== tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts ===
2+
function tag (str: any, ...args: any[]): string {
3+
>tag : (str: any, ...args: any[]) => string
4+
>str : any
5+
>args : any[]
6+
7+
return str
8+
>str : any
9+
}
10+
11+
const x = tag`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
12+
>x : string
13+
>tag`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld` : string
14+
>tag : (str: any, ...args: any[]) => string
15+
>`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld` : string
16+
>100 : 100
17+
>200 : 200
18+
>300 : 300
19+
20+
const y = `\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld`;
21+
>y : string
22+
>`\u{hello} ${ 100 } \xtraordinary ${ 200 } wonderful ${ 300 } \uworld` : string
23+
>100 : 100
24+
>200 : 200
25+
>300 : 300
26+
27+
const a1 = tag`${ 100 }\0` // \0
28+
>a1 : string
29+
>tag`${ 100 }\0` : string
30+
>tag : (str: any, ...args: any[]) => string
31+
>`${ 100 }\0` : string
32+
>100 : 100
33+
34+
const a2 = tag`${ 100 }\00` // \\00
35+
>a2 : string
36+
>tag`${ 100 }\00` : string
37+
>tag : (str: any, ...args: any[]) => string
38+
>`${ 100 }\00` : string
39+
>100 : 100
40+
41+
const a3 = tag`${ 100 }\u` // \\u
42+
>a3 : string
43+
>tag`${ 100 }\u` : string
44+
>tag : (str: any, ...args: any[]) => string
45+
>`${ 100 }\u` : string
46+
>100 : 100
47+
48+
const a4 = tag`${ 100 }\u0` // \\u0
49+
>a4 : string
50+
>tag`${ 100 }\u0` : string
51+
>tag : (str: any, ...args: any[]) => string
52+
>`${ 100 }\u0` : string
53+
>100 : 100
54+
55+
const a5 = tag`${ 100 }\u00` // \\u00
56+
>a5 : string
57+
>tag`${ 100 }\u00` : string
58+
>tag : (str: any, ...args: any[]) => string
59+
>`${ 100 }\u00` : string
60+
>100 : 100
61+
62+
const a6 = tag`${ 100 }\u000` // \\u000
63+
>a6 : string
64+
>tag`${ 100 }\u000` : string
65+
>tag : (str: any, ...args: any[]) => string
66+
>`${ 100 }\u000` : string
67+
>100 : 100
68+
69+
const a7 = tag`${ 100 }\u0000` // \u0000
70+
>a7 : string
71+
>tag`${ 100 }\u0000` : string
72+
>tag : (str: any, ...args: any[]) => string
73+
>`${ 100 }\u0000` : string
74+
>100 : 100
75+
76+
const a8 = tag`${ 100 }\u{` // \\u{
77+
>a8 : string
78+
>tag`${ 100 }\u{` : string
79+
>tag : (str: any, ...args: any[]) => string
80+
>`${ 100 }\u{` : string
81+
>100 : 100
82+
83+
const a9 = tag`${ 100 }\u{10FFFF}` // \\u{10FFFF
84+
>a9 : string
85+
>tag`${ 100 }\u{10FFFF}` : string
86+
>tag : (str: any, ...args: any[]) => string
87+
>`${ 100 }\u{10FFFF}` : string
88+
>100 : 100
89+
90+
const a10 = tag`${ 100 }\u{1f622` // \\u{1f622
91+
>a10 : string
92+
>tag`${ 100 }\u{1f622` : string
93+
>tag : (str: any, ...args: any[]) => string
94+
>`${ 100 }\u{1f622` : string
95+
>100 : 100
96+
97+
const a11 = tag`${ 100 }\u{1f622}` // \u{1f622}
98+
>a11 : string
99+
>tag`${ 100 }\u{1f622}` : string
100+
>tag : (str: any, ...args: any[]) => string
101+
>`${ 100 }\u{1f622}` : string
102+
>100 : 100
103+
104+
const a12 = tag`${ 100 }\x` // \\x
105+
>a12 : string
106+
>tag`${ 100 }\x` : string
107+
>tag : (str: any, ...args: any[]) => string
108+
>`${ 100 }\x` : string
109+
>100 : 100
110+
111+
const a13 = tag`${ 100 }\x0` // \\x0
112+
>a13 : string
113+
>tag`${ 100 }\x0` : string
114+
>tag : (str: any, ...args: any[]) => string
115+
>`${ 100 }\x0` : string
116+
>100 : 100
117+
118+
const a14 = tag`${ 100 }\x00` // \x00
119+
>a14 : string
120+
>tag`${ 100 }\x00` : string
121+
>tag : (str: any, ...args: any[]) => string
122+
>`${ 100 }\x00` : string
123+
>100 : 100
124+

tests/cases/conformance/es2018/template.ts renamed to tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ const a5 = tag`${ 100 }\u00` // \\u00
1313
const a6 = tag`${ 100 }\u000` // \\u000
1414
const a7 = tag`${ 100 }\u0000` // \u0000
1515
const a8 = tag`${ 100 }\u{` // \\u{
16-
const a9 = tag`${ 100 }\u{10FFFF` // \\u{10FFFF
17-
const a10 = tag`${ 100 }\u{1d306` // \\u{1d306
18-
const a11 = tag`${ 100 }\u{1d306}` // \u{1d306}
16+
const a9 = tag`${ 100 }\u{10FFFF}` // \\u{10FFFF
17+
const a10 = tag`${ 100 }\u{1f622` // \\u{1f622
18+
const a11 = tag`${ 100 }\u{1f622}` // \u{1f622}
1919
const a12 = tag`${ 100 }\x` // \\x
2020
const a13 = tag`${ 100 }\x0` // \\x0
21+
const a14 = tag`${ 100 }\x00` // \x00

0 commit comments

Comments
 (0)