Skip to content

Commit 4e945fb

Browse files
authored
fix(38299): use string literals as keys to creating rest result (microsoft#38600)
1 parent 68f8f22 commit 4e945fb

6 files changed

+39
-5
lines changed

src/compiler/emitter.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -4499,10 +4499,11 @@ namespace ts {
44994499
function getLiteralTextOfNode(node: LiteralLikeNode, neverAsciiEscape: boolean | undefined, jsxAttributeEscape: boolean): string {
45004500
if (node.kind === SyntaxKind.StringLiteral && (<StringLiteral>node).textSourceNode) {
45014501
const textSourceNode = (<StringLiteral>node).textSourceNode!;
4502-
if (isIdentifier(textSourceNode)) {
4503-
return jsxAttributeEscape ? `"${escapeJsxAttributeString(getTextOfNode(textSourceNode))}"` :
4504-
neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(getTextOfNode(textSourceNode))}"` :
4505-
`"${escapeNonAsciiString(getTextOfNode(textSourceNode))}"`;
4502+
if (isIdentifier(textSourceNode) || isNumericLiteral(textSourceNode)) {
4503+
const text = isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode(textSourceNode);
4504+
return jsxAttributeEscape ? `"${escapeJsxAttributeString(text)}"` :
4505+
neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(text)}"` :
4506+
`"${escapeNonAsciiString(text)}"`;
45064507
}
45074508
else {
45084509
return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [restElementWithNumberPropertyName.ts]
2+
const { 0: a, ...b } = [0, 1, 2];
3+
4+
5+
//// [restElementWithNumberPropertyName.js]
6+
var __rest = (this && this.__rest) || function (s, e) {
7+
var t = {};
8+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
9+
t[p] = s[p];
10+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
11+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
12+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
13+
t[p[i]] = s[p[i]];
14+
}
15+
return t;
16+
};
17+
var _a = [0, 1, 2], a = _a[0], b = __rest(_a, ["0"]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
=== tests/cases/compiler/restElementWithNumberPropertyName.ts ===
2+
const { 0: a, ...b } = [0, 1, 2];
3+
>a : Symbol(a, Decl(restElementWithNumberPropertyName.ts, 0, 7))
4+
>b : Symbol(b, Decl(restElementWithNumberPropertyName.ts, 0, 13))
5+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/compiler/restElementWithNumberPropertyName.ts ===
2+
const { 0: a, ...b } = [0, 1, 2];
3+
>a : number
4+
>b : { [n: number]: number; 0: number; 1: number; 2: number; length: 3; toString(): string; toLocaleString(): string; pop(): number; push(...items: number[]): number; concat(...items: ConcatArray<number>[]): number[]; concat(...items: (number | ConcatArray<number>)[]): number[]; join(separator?: string): string; reverse(): number[]; shift(): number; slice(start?: number, end?: number): number[]; sort(compareFn?: (a: number, b: number) => number): [number, number, number]; splice(start: number, deleteCount?: number): number[]; splice(start: number, deleteCount: number, ...items: number[]): number[]; unshift(...items: number[]): number; indexOf(searchElement: number, fromIndex?: number): number; lastIndexOf(searchElement: number, fromIndex?: number): number; every(callbackfn: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; some(callbackfn: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: number, index: number, array: number[]) => void, thisArg?: any): void; map<U>(callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any): U[]; filter<S extends number>(callbackfn: (value: number, index: number, array: number[]) => value is S, thisArg?: any): S[]; filter(callbackfn: (value: number, index: number, array: number[]) => unknown, thisArg?: any): number[]; reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; }
5+
>[0, 1, 2] : [number, number, number]
6+
>0 : 0
7+
>1 : 1
8+
>2 : 2
9+

tests/baselines/reference/restParameterWithBindingPattern3.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,5 @@ function e() {
5454
for (var _i = 0; _i < arguments.length; _i++) {
5555
_a[_i] = arguments[_i];
5656
}
57-
var _b = _a[0], a = _b === void 0 ? 1 : _b, _c = _a[1], b = _c === void 0 ? true : _c, rest = __rest(_a, [0, 1]);
57+
var _b = _a[0], a = _b === void 0 ? 1 : _b, _c = _a[1], b = _c === void 0 ? true : _c, rest = __rest(_a, ["0", "1"]);
5858
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @target: es5
2+
const { 0: a, ...b } = [0, 1, 2];

0 commit comments

Comments
 (0)