Use string representation for negative numeric property names (#37936)

This commit is contained in:
Wesley Wigham 2020-04-15 21:11:05 -07:00 committed by GitHub
parent ca1f467233
commit deb5bac520
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 226 additions and 16 deletions

View file

@ -5393,7 +5393,7 @@ namespace ts {
}
function createPropertyNameNodeForIdentifierOrLiteral(name: string, singleQuote?: boolean) {
return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) ? +name : name, !!singleQuote);
return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) && +name >= 0 ? +name : name, !!singleQuote);
}
function cloneNodeBuilderContext(context: NodeBuilderContext): NodeBuilderContext {

View file

@ -0,0 +1,59 @@
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts]
export enum MouseButton {
LEFT_BUTTON = 1,
RIGHT_BUTTON = 2,
MIDDLE_BUTTON = 4,
XBUTTON1_BUTTON = 5,
XBUTTON2_BUTTON = 6,
NO_BUTTON = 0,
}
export const DOMMouseButton = {
'-1': MouseButton.NO_BUTTON,
"0": MouseButton.LEFT_BUTTON,
"1": MouseButton.MIDDLE_BUTTON,
"2": MouseButton.RIGHT_BUTTON,
"3": MouseButton.XBUTTON1_BUTTON,
"4": MouseButton.XBUTTON2_BUTTON,
};
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.js]
"use strict";
exports.__esModule = true;
exports.DOMMouseButton = exports.MouseButton = void 0;
var MouseButton;
(function (MouseButton) {
MouseButton[MouseButton["LEFT_BUTTON"] = 1] = "LEFT_BUTTON";
MouseButton[MouseButton["RIGHT_BUTTON"] = 2] = "RIGHT_BUTTON";
MouseButton[MouseButton["MIDDLE_BUTTON"] = 4] = "MIDDLE_BUTTON";
MouseButton[MouseButton["XBUTTON1_BUTTON"] = 5] = "XBUTTON1_BUTTON";
MouseButton[MouseButton["XBUTTON2_BUTTON"] = 6] = "XBUTTON2_BUTTON";
MouseButton[MouseButton["NO_BUTTON"] = 0] = "NO_BUTTON";
})(MouseButton = exports.MouseButton || (exports.MouseButton = {}));
exports.DOMMouseButton = {
'-1': MouseButton.NO_BUTTON,
"0": MouseButton.LEFT_BUTTON,
"1": MouseButton.MIDDLE_BUTTON,
"2": MouseButton.RIGHT_BUTTON,
"3": MouseButton.XBUTTON1_BUTTON,
"4": MouseButton.XBUTTON2_BUTTON
};
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.d.ts]
export declare enum MouseButton {
LEFT_BUTTON = 1,
RIGHT_BUTTON = 2,
MIDDLE_BUTTON = 4,
XBUTTON1_BUTTON = 5,
XBUTTON2_BUTTON = 6,
NO_BUTTON = 0
}
export declare const DOMMouseButton: {
'-1': MouseButton;
0: MouseButton;
1: MouseButton;
2: MouseButton;
3: MouseButton;
4: MouseButton;
};

View file

@ -0,0 +1,63 @@
=== tests/cases/compiler/enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts ===
export enum MouseButton {
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
LEFT_BUTTON = 1,
>LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
RIGHT_BUTTON = 2,
>RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
MIDDLE_BUTTON = 4,
>MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
XBUTTON1_BUTTON = 5,
>XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
XBUTTON2_BUTTON = 6,
>XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
NO_BUTTON = 0,
>NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
}
export const DOMMouseButton = {
>DOMMouseButton : Symbol(DOMMouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 9, 12))
'-1': MouseButton.NO_BUTTON,
>'-1' : Symbol('-1', Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 9, 31))
>MouseButton.NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
"0": MouseButton.LEFT_BUTTON,
>"0" : Symbol("0", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 10, 29))
>MouseButton.LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
"1": MouseButton.MIDDLE_BUTTON,
>"1" : Symbol("1", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 11, 30))
>MouseButton.MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
"2": MouseButton.RIGHT_BUTTON,
>"2" : Symbol("2", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 12, 32))
>MouseButton.RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
"3": MouseButton.XBUTTON1_BUTTON,
>"3" : Symbol("3", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 13, 31))
>MouseButton.XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
"4": MouseButton.XBUTTON2_BUTTON,
>"4" : Symbol("4", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 14, 34))
>MouseButton.XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
>XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
};

View file

@ -0,0 +1,70 @@
=== tests/cases/compiler/enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts ===
export enum MouseButton {
>MouseButton : MouseButton
LEFT_BUTTON = 1,
>LEFT_BUTTON : MouseButton.LEFT_BUTTON
>1 : 1
RIGHT_BUTTON = 2,
>RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
>2 : 2
MIDDLE_BUTTON = 4,
>MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
>4 : 4
XBUTTON1_BUTTON = 5,
>XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
>5 : 5
XBUTTON2_BUTTON = 6,
>XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
>6 : 6
NO_BUTTON = 0,
>NO_BUTTON : MouseButton.NO_BUTTON
>0 : 0
}
export const DOMMouseButton = {
>DOMMouseButton : { '-1': MouseButton; 0: MouseButton; 1: MouseButton; 2: MouseButton; 3: MouseButton; 4: MouseButton; }
>{ '-1': MouseButton.NO_BUTTON, "0": MouseButton.LEFT_BUTTON, "1": MouseButton.MIDDLE_BUTTON, "2": MouseButton.RIGHT_BUTTON, "3": MouseButton.XBUTTON1_BUTTON, "4": MouseButton.XBUTTON2_BUTTON,} : { '-1': MouseButton; 0: MouseButton; 1: MouseButton; 2: MouseButton; 3: MouseButton; 4: MouseButton; }
'-1': MouseButton.NO_BUTTON,
>'-1' : MouseButton
>MouseButton.NO_BUTTON : MouseButton.NO_BUTTON
>MouseButton : typeof MouseButton
>NO_BUTTON : MouseButton.NO_BUTTON
"0": MouseButton.LEFT_BUTTON,
>"0" : MouseButton
>MouseButton.LEFT_BUTTON : MouseButton.LEFT_BUTTON
>MouseButton : typeof MouseButton
>LEFT_BUTTON : MouseButton.LEFT_BUTTON
"1": MouseButton.MIDDLE_BUTTON,
>"1" : MouseButton
>MouseButton.MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
>MouseButton : typeof MouseButton
>MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
"2": MouseButton.RIGHT_BUTTON,
>"2" : MouseButton
>MouseButton.RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
>MouseButton : typeof MouseButton
>RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
"3": MouseButton.XBUTTON1_BUTTON,
>"3" : MouseButton
>MouseButton.XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
>MouseButton : typeof MouseButton
>XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
"4": MouseButton.XBUTTON2_BUTTON,
>"4" : MouseButton
>MouseButton.XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
>MouseButton : typeof MouseButton
>XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
};

View file

@ -278,7 +278,7 @@ var r13 = i[-01]
>01 : 1
var a: {
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
"0.1": void;
>"0.1" : void
@ -308,19 +308,19 @@ var a: {
var r1 = a['0.1'];
>r1 : void
>a['0.1'] : void
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'0.1' : "0.1"
var r2 = a['.1'];
>r2 : Object
>a['.1'] : Object
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'.1' : ".1"
var r3 = a['1'];
>r3 : number
>a['1'] : number
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'1' : "1"
var r3 = c[1];
@ -332,7 +332,7 @@ var r3 = c[1];
var r4 = a['1.'];
>r4 : string
>a['1.'] : string
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'1.' : "1."
var r3 = c[1.]; // same as indexing by 1 when done numerically
@ -344,13 +344,13 @@ var r3 = c[1.]; // same as indexing by 1 when done numerically
var r5 = a['1..'];
>r5 : boolean
>a['1..'] : boolean
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'1..' : "1.."
var r6 = a['1.0'];
>r6 : Date
>a['1.0'] : Date
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
>'1.0' : "1.0"
var r3 = c[1.0]; // same as indexing by 1 when done numerically
@ -413,8 +413,8 @@ var r13 = i[-01]
>01 : 1
var b = {
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>{ "0.1": <void>null, ".1": new Object(), "1": 1, "1.": "", "1..": true, "1.0": new Date(), "-1.0": /123/, "-1": Date} : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>{ "0.1": <void>null, ".1": new Object(), "1": 1, "1.": "", "1..": true, "1.0": new Date(), "-1.0": /123/, "-1": Date} : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
"0.1": <void>null,
>"0.1" : void
@ -456,19 +456,19 @@ var b = {
var r1 = b['0.1'];
>r1 : void
>b['0.1'] : void
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'0.1' : "0.1"
var r2 = b['.1'];
>r2 : Object
>b['.1'] : Object
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'.1' : ".1"
var r3 = b['1'];
>r3 : number
>b['1'] : number
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'1' : "1"
var r3 = c[1];
@ -480,7 +480,7 @@ var r3 = c[1];
var r4 = b['1.'];
>r4 : string
>b['1.'] : string
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'1.' : "1."
var r3 = c[1.]; // same as indexing by 1 when done numerically
@ -492,13 +492,13 @@ var r3 = c[1.]; // same as indexing by 1 when done numerically
var r5 = b['1..'];
>r5 : boolean
>b['1..'] : boolean
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'1..' : "1.."
var r6 = b['1.0'];
>r6 : Date
>b['1.0'] : Date
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
>'1.0' : "1.0"
var r3 = c[1.0]; // same as indexing by 1 when done numerically

View file

@ -0,0 +1,18 @@
// @declaration: true
export enum MouseButton {
LEFT_BUTTON = 1,
RIGHT_BUTTON = 2,
MIDDLE_BUTTON = 4,
XBUTTON1_BUTTON = 5,
XBUTTON2_BUTTON = 6,
NO_BUTTON = 0,
}
export const DOMMouseButton = {
'-1': MouseButton.NO_BUTTON,
"0": MouseButton.LEFT_BUTTON,
"1": MouseButton.MIDDLE_BUTTON,
"2": MouseButton.RIGHT_BUTTON,
"3": MouseButton.XBUTTON1_BUTTON,
"4": MouseButton.XBUTTON2_BUTTON,
};