From 8017f1ec583bdec20264c1de646fcaa1ffde74e6 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Fri, 15 May 2020 22:23:12 +0300 Subject: [PATCH] fix(38299): use string literals as keys to creating rest result --- src/compiler/emitter.ts | 9 +++++---- .../restElementWithNumberPropertyName.js | 17 +++++++++++++++++ .../restElementWithNumberPropertyName.symbols | 5 +++++ .../restElementWithNumberPropertyName.types | 9 +++++++++ .../restParameterWithBindingPattern3.js | 2 +- .../restElementWithNumberPropertyName.ts | 2 ++ 6 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/restElementWithNumberPropertyName.js create mode 100644 tests/baselines/reference/restElementWithNumberPropertyName.symbols create mode 100644 tests/baselines/reference/restElementWithNumberPropertyName.types create mode 100644 tests/cases/compiler/restElementWithNumberPropertyName.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index dc4b9ad5f2f5e..dc5c6e9312a47 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4487,10 +4487,11 @@ namespace ts { function getLiteralTextOfNode(node: LiteralLikeNode, neverAsciiEscape: boolean | undefined, jsxAttributeEscape: boolean): string { if (node.kind === SyntaxKind.StringLiteral && (node).textSourceNode) { const textSourceNode = (node).textSourceNode!; - if (isIdentifier(textSourceNode)) { - return jsxAttributeEscape ? `"${escapeJsxAttributeString(getTextOfNode(textSourceNode))}"` : - neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(getTextOfNode(textSourceNode))}"` : - `"${escapeNonAsciiString(getTextOfNode(textSourceNode))}"`; + if (isIdentifier(textSourceNode) || isNumericLiteral(textSourceNode)) { + const text = isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode(textSourceNode); + return jsxAttributeEscape ? `"${escapeJsxAttributeString(text)}"` : + neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(text)}"` : + `"${escapeNonAsciiString(text)}"`; } else { return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape); diff --git a/tests/baselines/reference/restElementWithNumberPropertyName.js b/tests/baselines/reference/restElementWithNumberPropertyName.js new file mode 100644 index 0000000000000..d0829998eb956 --- /dev/null +++ b/tests/baselines/reference/restElementWithNumberPropertyName.js @@ -0,0 +1,17 @@ +//// [restElementWithNumberPropertyName.ts] +const { 0: a, ...b } = [0, 1, 2]; + + +//// [restElementWithNumberPropertyName.js] +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var _a = [0, 1, 2], a = _a[0], b = __rest(_a, ["0"]); diff --git a/tests/baselines/reference/restElementWithNumberPropertyName.symbols b/tests/baselines/reference/restElementWithNumberPropertyName.symbols new file mode 100644 index 0000000000000..da804ef7014a9 --- /dev/null +++ b/tests/baselines/reference/restElementWithNumberPropertyName.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/restElementWithNumberPropertyName.ts === +const { 0: a, ...b } = [0, 1, 2]; +>a : Symbol(a, Decl(restElementWithNumberPropertyName.ts, 0, 7)) +>b : Symbol(b, Decl(restElementWithNumberPropertyName.ts, 0, 13)) + diff --git a/tests/baselines/reference/restElementWithNumberPropertyName.types b/tests/baselines/reference/restElementWithNumberPropertyName.types new file mode 100644 index 0000000000000..a39a1ac5c2410 --- /dev/null +++ b/tests/baselines/reference/restElementWithNumberPropertyName.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/restElementWithNumberPropertyName.ts === +const { 0: a, ...b } = [0, 1, 2]; +>a : number +>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[]; concat(...items: (number | ConcatArray)[]): 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(callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any): U[]; filter(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(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(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; } +>[0, 1, 2] : [number, number, number] +>0 : 0 +>1 : 1 +>2 : 2 + diff --git a/tests/baselines/reference/restParameterWithBindingPattern3.js b/tests/baselines/reference/restParameterWithBindingPattern3.js index 9f52594f7cb0d..3894d0f340085 100644 --- a/tests/baselines/reference/restParameterWithBindingPattern3.js +++ b/tests/baselines/reference/restParameterWithBindingPattern3.js @@ -54,5 +54,5 @@ function e() { for (var _i = 0; _i < arguments.length; _i++) { _a[_i] = arguments[_i]; } - var _b = _a[0], a = _b === void 0 ? 1 : _b, _c = _a[1], b = _c === void 0 ? true : _c, rest = __rest(_a, [0, 1]); + var _b = _a[0], a = _b === void 0 ? 1 : _b, _c = _a[1], b = _c === void 0 ? true : _c, rest = __rest(_a, ["0", "1"]); } diff --git a/tests/cases/compiler/restElementWithNumberPropertyName.ts b/tests/cases/compiler/restElementWithNumberPropertyName.ts new file mode 100644 index 0000000000000..778a968c54f8d --- /dev/null +++ b/tests/cases/compiler/restElementWithNumberPropertyName.ts @@ -0,0 +1,2 @@ +// @target: es5 +const { 0: a, ...b } = [0, 1, 2];