Skip to content

Commit 4657c2d

Browse files
Emit all strings with extended escapes using the same scheme as templates.
1 parent 9d89668 commit 4657c2d

37 files changed

+74
-29
lines changed

src/compiler/emitter.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2187,9 +2187,12 @@ module ts {
21872187
}
21882188

21892189
function emitLiteral(node: LiteralExpression) {
2190-
var text = languageVersion < ScriptTarget.ES6 && isTemplateLiteralKind(node.kind) ? getTemplateLiteralAsStringLiteral(node) :
2191-
node.parent ? getSourceTextOfNodeFromSourceFile(currentSourceFile, node) :
2192-
node.text;
2190+
var text = languageVersion < ScriptTarget.ES6 && (isTemplateLiteralKind(node.kind) || node.hasExtendedUnicodeEscape)
2191+
? getDoubleQuotedStringTextOfLiteral(node)
2192+
: node.parent
2193+
? getSourceTextOfNodeFromSourceFile(currentSourceFile, node)
2194+
: node.text; // TODO(drosen): Is this correct?
2195+
21932196
if (compilerOptions.sourceMap && (node.kind === SyntaxKind.StringLiteral || isTemplateLiteralKind(node.kind))) {
21942197
writer.writeLiteral(text);
21952198
}
@@ -2202,7 +2205,7 @@ module ts {
22022205
}
22032206
}
22042207

2205-
function getTemplateLiteralAsStringLiteral(node: LiteralExpression): string {
2208+
function getDoubleQuotedStringTextOfLiteral(node: LiteralExpression): string {
22062209
var result = escapeString(node.text);
22072210
result = replaceNonAsciiCharacters(result);
22082211

src/compiler/parser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,6 +2164,10 @@ module ts {
21642164
var text = scanner.getTokenValue();
21652165
node.text = internName ? internIdentifier(text) : text;
21662166

2167+
if (scanner.hasExtendedUnicodeEscape()) {
2168+
node.hasExtendedUnicodeEscape = true;
2169+
}
2170+
21672171
if (scanner.isUnterminated()) {
21682172
node.isUnterminated = true;
21692173
}

src/compiler/scanner.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module ts {
1414
getTokenPos(): number;
1515
getTokenText(): string;
1616
getTokenValue(): string;
17+
hasExtendedUnicodeEscape(): boolean;
1718
hasPrecedingLineBreak(): boolean;
1819
isIdentifier(): boolean;
1920
isReservedWord(): boolean;
@@ -556,6 +557,7 @@ module ts {
556557
var token: SyntaxKind;
557558
var tokenValue: string;
558559
var precedingLineBreak: boolean;
560+
var hasExtendedUnicodeEscape: boolean;
559561
var tokenIsUnterminated: boolean;
560562

561563
function error(message: DiagnosticMessage, length?: number): void {
@@ -776,6 +778,7 @@ module ts {
776778
return "\"";
777779
case CharacterCodes.u:
778780
if (text.charCodeAt(pos) === CharacterCodes.openBrace) {
781+
hasExtendedUnicodeEscape = true;
779782
pos++;
780783
var escapedValue = scanMinimumNumberOfHexDigits(1);
781784

@@ -926,6 +929,7 @@ module ts {
926929

927930
function scan(): SyntaxKind {
928931
startPos = pos;
932+
hasExtendedUnicodeEscape = false;
929933
precedingLineBreak = false;
930934
tokenIsUnterminated = false;
931935
while (true) {
@@ -1393,6 +1397,7 @@ module ts {
13931397
getTokenPos: () => tokenPos,
13941398
getTokenText: () => text.substring(tokenPos, pos),
13951399
getTokenValue: () => tokenValue,
1400+
hasExtendedUnicodeEscape: () => hasExtendedUnicodeEscape,
13961401
hasPrecedingLineBreak: () => precedingLineBreak,
13971402
isIdentifier: () => token === SyntaxKind.Identifier || token > SyntaxKind.LastReservedWord,
13981403
isReservedWord: () => token >= SyntaxKind.FirstReservedWord && token <= SyntaxKind.LastReservedWord,

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ module ts {
655655
export interface LiteralExpression extends PrimaryExpression {
656656
text: string;
657657
isUnterminated?: boolean;
658+
hasExtendedUnicodeEscape?: boolean;
658659
}
659660

660661
export interface StringLiteralExpression extends LiteralExpression {

tests/baselines/reference/APISample_compile.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ declare module "typescript" {
552552
interface LiteralExpression extends PrimaryExpression {
553553
text: string;
554554
isUnterminated?: boolean;
555+
hasExtendedUnicodeEscape?: boolean;
555556
}
556557
interface StringLiteralExpression extends LiteralExpression {
557558
_stringLiteralExpressionBrand: any;
@@ -1421,6 +1422,7 @@ declare module "typescript" {
14211422
getTokenPos(): number;
14221423
getTokenText(): string;
14231424
getTokenValue(): string;
1425+
hasExtendedUnicodeEscape(): boolean;
14241426
hasPrecedingLineBreak(): boolean;
14251427
isIdentifier(): boolean;
14261428
isReservedWord(): boolean;

tests/baselines/reference/APISample_compile.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,9 @@ declare module "typescript" {
16641664

16651665
isUnterminated?: boolean;
16661666
>isUnterminated : boolean
1667+
1668+
hasExtendedUnicodeEscape?: boolean;
1669+
>hasExtendedUnicodeEscape : boolean
16671670
}
16681671
interface StringLiteralExpression extends LiteralExpression {
16691672
>StringLiteralExpression : StringLiteralExpression
@@ -4481,6 +4484,9 @@ declare module "typescript" {
44814484
getTokenValue(): string;
44824485
>getTokenValue : () => string
44834486

4487+
hasExtendedUnicodeEscape(): boolean;
4488+
>hasExtendedUnicodeEscape : () => boolean
4489+
44844490
hasPrecedingLineBreak(): boolean;
44854491
>hasPrecedingLineBreak : () => boolean
44864492

tests/baselines/reference/APISample_linter.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ declare module "typescript" {
583583
interface LiteralExpression extends PrimaryExpression {
584584
text: string;
585585
isUnterminated?: boolean;
586+
hasExtendedUnicodeEscape?: boolean;
586587
}
587588
interface StringLiteralExpression extends LiteralExpression {
588589
_stringLiteralExpressionBrand: any;
@@ -1452,6 +1453,7 @@ declare module "typescript" {
14521453
getTokenPos(): number;
14531454
getTokenText(): string;
14541455
getTokenValue(): string;
1456+
hasExtendedUnicodeEscape(): boolean;
14551457
hasPrecedingLineBreak(): boolean;
14561458
isIdentifier(): boolean;
14571459
isReservedWord(): boolean;

tests/baselines/reference/APISample_linter.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,6 +1810,9 @@ declare module "typescript" {
18101810

18111811
isUnterminated?: boolean;
18121812
>isUnterminated : boolean
1813+
1814+
hasExtendedUnicodeEscape?: boolean;
1815+
>hasExtendedUnicodeEscape : boolean
18131816
}
18141817
interface StringLiteralExpression extends LiteralExpression {
18151818
>StringLiteralExpression : StringLiteralExpression
@@ -4627,6 +4630,9 @@ declare module "typescript" {
46274630
getTokenValue(): string;
46284631
>getTokenValue : () => string
46294632

4633+
hasExtendedUnicodeEscape(): boolean;
4634+
>hasExtendedUnicodeEscape : () => boolean
4635+
46304636
hasPrecedingLineBreak(): boolean;
46314637
>hasPrecedingLineBreak : () => boolean
46324638

tests/baselines/reference/APISample_transform.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ declare module "typescript" {
584584
interface LiteralExpression extends PrimaryExpression {
585585
text: string;
586586
isUnterminated?: boolean;
587+
hasExtendedUnicodeEscape?: boolean;
587588
}
588589
interface StringLiteralExpression extends LiteralExpression {
589590
_stringLiteralExpressionBrand: any;
@@ -1453,6 +1454,7 @@ declare module "typescript" {
14531454
getTokenPos(): number;
14541455
getTokenText(): string;
14551456
getTokenValue(): string;
1457+
hasExtendedUnicodeEscape(): boolean;
14561458
hasPrecedingLineBreak(): boolean;
14571459
isIdentifier(): boolean;
14581460
isReservedWord(): boolean;

tests/baselines/reference/APISample_transform.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,6 +1760,9 @@ declare module "typescript" {
17601760

17611761
isUnterminated?: boolean;
17621762
>isUnterminated : boolean
1763+
1764+
hasExtendedUnicodeEscape?: boolean;
1765+
>hasExtendedUnicodeEscape : boolean
17631766
}
17641767
interface StringLiteralExpression extends LiteralExpression {
17651768
>StringLiteralExpression : StringLiteralExpression
@@ -4577,6 +4580,9 @@ declare module "typescript" {
45774580
getTokenValue(): string;
45784581
>getTokenValue : () => string
45794582

4583+
hasExtendedUnicodeEscape(): boolean;
4584+
>hasExtendedUnicodeEscape : () => boolean
4585+
45804586
hasPrecedingLineBreak(): boolean;
45814587
>hasPrecedingLineBreak : () => boolean
45824588

tests/baselines/reference/APISample_watcher.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ declare module "typescript" {
621621
interface LiteralExpression extends PrimaryExpression {
622622
text: string;
623623
isUnterminated?: boolean;
624+
hasExtendedUnicodeEscape?: boolean;
624625
}
625626
interface StringLiteralExpression extends LiteralExpression {
626627
_stringLiteralExpressionBrand: any;
@@ -1490,6 +1491,7 @@ declare module "typescript" {
14901491
getTokenPos(): number;
14911492
getTokenText(): string;
14921493
getTokenValue(): string;
1494+
hasExtendedUnicodeEscape(): boolean;
14931495
hasPrecedingLineBreak(): boolean;
14941496
isIdentifier(): boolean;
14951497
isReservedWord(): boolean;

tests/baselines/reference/APISample_watcher.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,9 @@ declare module "typescript" {
19331933

19341934
isUnterminated?: boolean;
19351935
>isUnterminated : boolean
1936+
1937+
hasExtendedUnicodeEscape?: boolean;
1938+
>hasExtendedUnicodeEscape : boolean
19361939
}
19371940
interface StringLiteralExpression extends LiteralExpression {
19381941
>StringLiteralExpression : StringLiteralExpression
@@ -4750,6 +4753,9 @@ declare module "typescript" {
47504753
getTokenValue(): string;
47514754
>getTokenValue : () => string
47524755

4756+
hasExtendedUnicodeEscape(): boolean;
4757+
>hasExtendedUnicodeEscape : () => boolean
4758+
47534759
hasPrecedingLineBreak(): boolean;
47544760
>hasPrecedingLineBreak : () => boolean
47554761

tests/baselines/reference/unicodeExtendedEscapesInStrings01_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{0}";
44

55

66
//// [unicodeExtendedEscapesInStrings01_ES5.js]
7-
var x = "\u{0}";
7+
var x = "\0";

tests/baselines/reference/unicodeExtendedEscapesInStrings02_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00}";
44

55

66
//// [unicodeExtendedEscapesInStrings02_ES5.js]
7-
var x = "\u{00}";
7+
var x = "\0";

tests/baselines/reference/unicodeExtendedEscapesInStrings03_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{0000}";
44

55

66
//// [unicodeExtendedEscapesInStrings03_ES5.js]
7-
var x = "\u{0000}";
7+
var x = "\0";

tests/baselines/reference/unicodeExtendedEscapesInStrings04_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00000000}";
44

55

66
//// [unicodeExtendedEscapesInStrings04_ES5.js]
7-
var x = "\u{00000000}";
7+
var x = "\0";

tests/baselines/reference/unicodeExtendedEscapesInStrings05_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{48}\u{65}\u{6c}\u{6c}\u{6f}\u{20}\u{77}\u{6f}\u{72}\u{6c}\u{64}";
44

55

66
//// [unicodeExtendedEscapesInStrings05_ES5.js]
7-
var x = "\u{48}\u{65}\u{6c}\u{6c}\u{6f}\u{20}\u{77}\u{6f}\u{72}\u{6c}\u{64}";
7+
var x = "Hello world";

tests/baselines/reference/unicodeExtendedEscapesInStrings06_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ var x = "\u{10FFFF}";
88
//// [unicodeExtendedEscapesInStrings06_ES5.js]
99
// ES6 Spec - 10.1.1 Static Semantics: UTF16Encoding (cp)
1010
// 1. Assert: 0 ≤ cp ≤ 0x10FFFF.
11-
var x = "\u{10FFFF}";
11+
var x = "\uDBFF\uDFFF";

tests/baselines/reference/unicodeExtendedEscapesInStrings07_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ var x = "\u{110000}";
88
//// [unicodeExtendedEscapesInStrings07_ES5.js]
99
// ES6 Spec - 10.1.1 Static Semantics: UTF16Encoding (cp)
1010
// 1. Assert: 0 ≤ cp ≤ 0x10FFFF.
11-
var x = "\u{110000}";
11+
var x = "}";

tests/baselines/reference/unicodeExtendedEscapesInStrings08_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ var x = "\u{FFFF}";
1010
// ES6 Spec - 10.1.1 Static Semantics: UTF16Encoding (cp)
1111
// 2. If cp ≤ 65535, return cp.
1212
// (FFFF == 65535)
13-
var x = "\u{FFFF}";
13+
var x = "\uFFFF";

tests/baselines/reference/unicodeExtendedEscapesInStrings09_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ var x = "\u{10000}";
1010
// ES6 Spec - 10.1.1 Static Semantics: UTF16Encoding (cp)
1111
// 2. If cp ≤ 65535, return cp.
1212
// (10000 == 65536)
13-
var x = "\u{10000}";
13+
var x = "\uD800\uDC00";

tests/baselines/reference/unicodeExtendedEscapesInStrings10_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ var x = "\u{D800}";
1212
// 2. Let cu1 be floor((cp – 65536) / 1024) + 0xD800.
1313
// Although we should just get back a single code point value of 0xD800,
1414
// this is a useful edge-case test.
15-
var x = "\u{D800}";
15+
var x = "\uD800";

tests/baselines/reference/unicodeExtendedEscapesInStrings11_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ var x = "\u{DC00}";
1212
// 2. Let cu2 be ((cp – 65536) modulo 1024) + 0xDC00.
1313
// Although we should just get back a single code point value of 0xDC00,
1414
// this is a useful edge-case test.
15-
var x = "\u{DC00}";
15+
var x = "\uDC00";

tests/baselines/reference/unicodeExtendedEscapesInStrings12_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{FFFFFFFF}";
44

55

66
//// [unicodeExtendedEscapesInStrings12_ES5.js]
7-
var x = "\u{FFFFFFFF}";
7+
var x = "}";

tests/baselines/reference/unicodeExtendedEscapesInStrings13_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{DDDDD}";
44

55

66
//// [unicodeExtendedEscapesInStrings13_ES5.js]
7-
var x = "\u{DDDDD}";
7+
var x = "\uDB37\uDDDD";

tests/baselines/reference/unicodeExtendedEscapesInStrings14_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ var x = "\u{-DDDD}";
66

77
//// [unicodeExtendedEscapesInStrings14_ES5.js]
88
// Shouldn't work, negatives are not allowed.
9-
var x = "\u{-DDDD}";
9+
var x = "-DDDD}";

tests/baselines/reference/unicodeExtendedEscapesInStrings15_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{abcd}\u{ef12}\u{3456}\u{7890}";
44

55

66
//// [unicodeExtendedEscapesInStrings15_ES5.js]
7-
var x = "\u{abcd}\u{ef12}\u{3456}\u{7890}";
7+
var x = "\uABCD\uEF12\u3456\u7890";

tests/baselines/reference/unicodeExtendedEscapesInStrings16_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{ABCD}\u{EF12}\u{3456}\u{7890}";
44

55

66
//// [unicodeExtendedEscapesInStrings16_ES5.js]
7-
var x = "\u{ABCD}\u{EF12}\u{3456}\u{7890}";
7+
var x = "\uABCD\uEF12\u3456\u7890";

tests/baselines/reference/unicodeExtendedEscapesInStrings17_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{r}\u{n}\u{t}";
44

55

66
//// [unicodeExtendedEscapesInStrings17_ES5.js]
7-
var x = "\u{r}\u{n}\u{t}";
7+
var x = "r}n}t}";

tests/baselines/reference/unicodeExtendedEscapesInStrings18_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{65}\u{65}";
44

55

66
//// [unicodeExtendedEscapesInStrings18_ES5.js]
7-
var x = "\u{65}\u{65}";
7+
var x = "ee";

tests/baselines/reference/unicodeExtendedEscapesInStrings19_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{}";
44

55

66
//// [unicodeExtendedEscapesInStrings19_ES5.js]
7-
var x = "\u{}";
7+
var x = "}";

tests/baselines/reference/unicodeExtendedEscapesInStrings20_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{";
44

55

66
//// [unicodeExtendedEscapesInStrings20_ES5.js]
7-
var x = "\u{";
7+
var x = "";

tests/baselines/reference/unicodeExtendedEscapesInStrings21_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{67";
44

55

66
//// [unicodeExtendedEscapesInStrings21_ES5.js]
7-
var x = "\u{67";
7+
var x = "g";

tests/baselines/reference/unicodeExtendedEscapesInStrings22_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00000000000067";
44

55

66
//// [unicodeExtendedEscapesInStrings22_ES5.js]
7-
var x = "\u{00000000000067";
7+
var x = "g";

tests/baselines/reference/unicodeExtendedEscapesInStrings23_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00000000000067}";
44

55

66
//// [unicodeExtendedEscapesInStrings23_ES5.js]
7-
var x = "\u{00000000000067}";
7+
var x = "g";

tests/baselines/reference/unicodeExtendedEscapesInStrings24_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00000000000067
44

55

66
//// [unicodeExtendedEscapesInStrings24_ES5.js]
7-
var x = "\u{00000000000067;
7+
var x = "g";

tests/baselines/reference/unicodeExtendedEscapesInStrings25_ES5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ var x = "\u{00000000000067}
44

55

66
//// [unicodeExtendedEscapesInStrings25_ES5.js]
7-
var x = "\u{00000000000067};
7+
var x = "g";

0 commit comments

Comments
 (0)