Skip to content

Commit deb5bac

Browse files
authored
Use string representation for negative numeric property names (#37936)
1 parent ca1f467 commit deb5bac

6 files changed

+226
-16
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5393,7 +5393,7 @@ namespace ts {
53935393
}
53945394

53955395
function createPropertyNameNodeForIdentifierOrLiteral(name: string, singleQuote?: boolean) {
5396-
return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) ? +name : name, !!singleQuote);
5396+
return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) && +name >= 0 ? +name : name, !!singleQuote);
53975397
}
53985398

53995399
function cloneNodeBuilderContext(context: NodeBuilderContext): NodeBuilderContext {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts]
2+
export enum MouseButton {
3+
LEFT_BUTTON = 1,
4+
RIGHT_BUTTON = 2,
5+
MIDDLE_BUTTON = 4,
6+
XBUTTON1_BUTTON = 5,
7+
XBUTTON2_BUTTON = 6,
8+
NO_BUTTON = 0,
9+
}
10+
11+
export const DOMMouseButton = {
12+
'-1': MouseButton.NO_BUTTON,
13+
"0": MouseButton.LEFT_BUTTON,
14+
"1": MouseButton.MIDDLE_BUTTON,
15+
"2": MouseButton.RIGHT_BUTTON,
16+
"3": MouseButton.XBUTTON1_BUTTON,
17+
"4": MouseButton.XBUTTON2_BUTTON,
18+
};
19+
20+
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.js]
21+
"use strict";
22+
exports.__esModule = true;
23+
exports.DOMMouseButton = exports.MouseButton = void 0;
24+
var MouseButton;
25+
(function (MouseButton) {
26+
MouseButton[MouseButton["LEFT_BUTTON"] = 1] = "LEFT_BUTTON";
27+
MouseButton[MouseButton["RIGHT_BUTTON"] = 2] = "RIGHT_BUTTON";
28+
MouseButton[MouseButton["MIDDLE_BUTTON"] = 4] = "MIDDLE_BUTTON";
29+
MouseButton[MouseButton["XBUTTON1_BUTTON"] = 5] = "XBUTTON1_BUTTON";
30+
MouseButton[MouseButton["XBUTTON2_BUTTON"] = 6] = "XBUTTON2_BUTTON";
31+
MouseButton[MouseButton["NO_BUTTON"] = 0] = "NO_BUTTON";
32+
})(MouseButton = exports.MouseButton || (exports.MouseButton = {}));
33+
exports.DOMMouseButton = {
34+
'-1': MouseButton.NO_BUTTON,
35+
"0": MouseButton.LEFT_BUTTON,
36+
"1": MouseButton.MIDDLE_BUTTON,
37+
"2": MouseButton.RIGHT_BUTTON,
38+
"3": MouseButton.XBUTTON1_BUTTON,
39+
"4": MouseButton.XBUTTON2_BUTTON
40+
};
41+
42+
43+
//// [enumKeysQuotedAsObjectPropertiesInDeclarationEmit.d.ts]
44+
export declare enum MouseButton {
45+
LEFT_BUTTON = 1,
46+
RIGHT_BUTTON = 2,
47+
MIDDLE_BUTTON = 4,
48+
XBUTTON1_BUTTON = 5,
49+
XBUTTON2_BUTTON = 6,
50+
NO_BUTTON = 0
51+
}
52+
export declare const DOMMouseButton: {
53+
'-1': MouseButton;
54+
0: MouseButton;
55+
1: MouseButton;
56+
2: MouseButton;
57+
3: MouseButton;
58+
4: MouseButton;
59+
};
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
=== tests/cases/compiler/enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts ===
2+
export enum MouseButton {
3+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
4+
5+
LEFT_BUTTON = 1,
6+
>LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
7+
8+
RIGHT_BUTTON = 2,
9+
>RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
10+
11+
MIDDLE_BUTTON = 4,
12+
>MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
13+
14+
XBUTTON1_BUTTON = 5,
15+
>XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
16+
17+
XBUTTON2_BUTTON = 6,
18+
>XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
19+
20+
NO_BUTTON = 0,
21+
>NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
22+
}
23+
24+
export const DOMMouseButton = {
25+
>DOMMouseButton : Symbol(DOMMouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 9, 12))
26+
27+
'-1': MouseButton.NO_BUTTON,
28+
>'-1' : Symbol('-1', Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 9, 31))
29+
>MouseButton.NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
30+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
31+
>NO_BUTTON : Symbol(MouseButton.NO_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 5, 21))
32+
33+
"0": MouseButton.LEFT_BUTTON,
34+
>"0" : Symbol("0", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 10, 29))
35+
>MouseButton.LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
36+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
37+
>LEFT_BUTTON : Symbol(MouseButton.LEFT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 25))
38+
39+
"1": MouseButton.MIDDLE_BUTTON,
40+
>"1" : Symbol("1", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 11, 30))
41+
>MouseButton.MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
42+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
43+
>MIDDLE_BUTTON : Symbol(MouseButton.MIDDLE_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 2, 18))
44+
45+
"2": MouseButton.RIGHT_BUTTON,
46+
>"2" : Symbol("2", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 12, 32))
47+
>MouseButton.RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
48+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
49+
>RIGHT_BUTTON : Symbol(MouseButton.RIGHT_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 1, 17))
50+
51+
"3": MouseButton.XBUTTON1_BUTTON,
52+
>"3" : Symbol("3", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 13, 31))
53+
>MouseButton.XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
54+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
55+
>XBUTTON1_BUTTON : Symbol(MouseButton.XBUTTON1_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 3, 19))
56+
57+
"4": MouseButton.XBUTTON2_BUTTON,
58+
>"4" : Symbol("4", Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 14, 34))
59+
>MouseButton.XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
60+
>MouseButton : Symbol(MouseButton, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 0, 0))
61+
>XBUTTON2_BUTTON : Symbol(MouseButton.XBUTTON2_BUTTON, Decl(enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts, 4, 21))
62+
63+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
=== tests/cases/compiler/enumKeysQuotedAsObjectPropertiesInDeclarationEmit.ts ===
2+
export enum MouseButton {
3+
>MouseButton : MouseButton
4+
5+
LEFT_BUTTON = 1,
6+
>LEFT_BUTTON : MouseButton.LEFT_BUTTON
7+
>1 : 1
8+
9+
RIGHT_BUTTON = 2,
10+
>RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
11+
>2 : 2
12+
13+
MIDDLE_BUTTON = 4,
14+
>MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
15+
>4 : 4
16+
17+
XBUTTON1_BUTTON = 5,
18+
>XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
19+
>5 : 5
20+
21+
XBUTTON2_BUTTON = 6,
22+
>XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
23+
>6 : 6
24+
25+
NO_BUTTON = 0,
26+
>NO_BUTTON : MouseButton.NO_BUTTON
27+
>0 : 0
28+
}
29+
30+
export const DOMMouseButton = {
31+
>DOMMouseButton : { '-1': MouseButton; 0: MouseButton; 1: MouseButton; 2: MouseButton; 3: MouseButton; 4: MouseButton; }
32+
>{ '-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; }
33+
34+
'-1': MouseButton.NO_BUTTON,
35+
>'-1' : MouseButton
36+
>MouseButton.NO_BUTTON : MouseButton.NO_BUTTON
37+
>MouseButton : typeof MouseButton
38+
>NO_BUTTON : MouseButton.NO_BUTTON
39+
40+
"0": MouseButton.LEFT_BUTTON,
41+
>"0" : MouseButton
42+
>MouseButton.LEFT_BUTTON : MouseButton.LEFT_BUTTON
43+
>MouseButton : typeof MouseButton
44+
>LEFT_BUTTON : MouseButton.LEFT_BUTTON
45+
46+
"1": MouseButton.MIDDLE_BUTTON,
47+
>"1" : MouseButton
48+
>MouseButton.MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
49+
>MouseButton : typeof MouseButton
50+
>MIDDLE_BUTTON : MouseButton.MIDDLE_BUTTON
51+
52+
"2": MouseButton.RIGHT_BUTTON,
53+
>"2" : MouseButton
54+
>MouseButton.RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
55+
>MouseButton : typeof MouseButton
56+
>RIGHT_BUTTON : MouseButton.RIGHT_BUTTON
57+
58+
"3": MouseButton.XBUTTON1_BUTTON,
59+
>"3" : MouseButton
60+
>MouseButton.XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
61+
>MouseButton : typeof MouseButton
62+
>XBUTTON1_BUTTON : MouseButton.XBUTTON1_BUTTON
63+
64+
"4": MouseButton.XBUTTON2_BUTTON,
65+
>"4" : MouseButton
66+
>MouseButton.XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
67+
>MouseButton : typeof MouseButton
68+
>XBUTTON2_BUTTON : MouseButton.XBUTTON2_BUTTON
69+
70+
};

tests/baselines/reference/objectTypeWithStringNamedNumericProperty.types

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ var r13 = i[-01]
278278
>01 : 1
279279

280280
var a: {
281-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
281+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
282282

283283
"0.1": void;
284284
>"0.1" : void
@@ -308,19 +308,19 @@ var a: {
308308
var r1 = a['0.1'];
309309
>r1 : void
310310
>a['0.1'] : void
311-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
311+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
312312
>'0.1' : "0.1"
313313

314314
var r2 = a['.1'];
315315
>r2 : Object
316316
>a['.1'] : Object
317-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
317+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
318318
>'.1' : ".1"
319319

320320
var r3 = a['1'];
321321
>r3 : number
322322
>a['1'] : number
323-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
323+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
324324
>'1' : "1"
325325

326326
var r3 = c[1];
@@ -332,7 +332,7 @@ var r3 = c[1];
332332
var r4 = a['1.'];
333333
>r4 : string
334334
>a['1.'] : string
335-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
335+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
336336
>'1.' : "1."
337337

338338
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
344344
var r5 = a['1..'];
345345
>r5 : boolean
346346
>a['1..'] : boolean
347-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
347+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
348348
>'1..' : "1.."
349349

350350
var r6 = a['1.0'];
351351
>r6 : Date
352352
>a['1.0'] : Date
353-
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: Date; }
353+
>a : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": Date; }
354354
>'1.0' : "1.0"
355355

356356
var r3 = c[1.0]; // same as indexing by 1 when done numerically
@@ -413,8 +413,8 @@ var r13 = i[-01]
413413
>01 : 1
414414

415415
var b = {
416-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
417-
>{ "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; }
416+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
417+
>{ "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; }
418418

419419
"0.1": <void>null,
420420
>"0.1" : void
@@ -456,19 +456,19 @@ var b = {
456456
var r1 = b['0.1'];
457457
>r1 : void
458458
>b['0.1'] : void
459-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
459+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
460460
>'0.1' : "0.1"
461461

462462
var r2 = b['.1'];
463463
>r2 : Object
464464
>b['.1'] : Object
465-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
465+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
466466
>'.1' : ".1"
467467

468468
var r3 = b['1'];
469469
>r3 : number
470470
>b['1'] : number
471-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
471+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
472472
>'1' : "1"
473473

474474
var r3 = c[1];
@@ -480,7 +480,7 @@ var r3 = c[1];
480480
var r4 = b['1.'];
481481
>r4 : string
482482
>b['1.'] : string
483-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
483+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
484484
>'1.' : "1."
485485

486486
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
492492
var r5 = b['1..'];
493493
>r5 : boolean
494494
>b['1..'] : boolean
495-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
495+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
496496
>'1..' : "1.."
497497

498498
var r6 = b['1.0'];
499499
>r6 : Date
500500
>b['1.0'] : Date
501-
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; -1: DateConstructor; }
501+
>b : { 0.1: void; ".1": Object; 1: number; "1.": string; "1..": boolean; "1.0": Date; "-1.0": RegExp; "-1": DateConstructor; }
502502
>'1.0' : "1.0"
503503

504504
var r3 = c[1.0]; // same as indexing by 1 when done numerically
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @declaration: true
2+
export enum MouseButton {
3+
LEFT_BUTTON = 1,
4+
RIGHT_BUTTON = 2,
5+
MIDDLE_BUTTON = 4,
6+
XBUTTON1_BUTTON = 5,
7+
XBUTTON2_BUTTON = 6,
8+
NO_BUTTON = 0,
9+
}
10+
11+
export const DOMMouseButton = {
12+
'-1': MouseButton.NO_BUTTON,
13+
"0": MouseButton.LEFT_BUTTON,
14+
"1": MouseButton.MIDDLE_BUTTON,
15+
"2": MouseButton.RIGHT_BUTTON,
16+
"3": MouseButton.XBUTTON1_BUTTON,
17+
"4": MouseButton.XBUTTON2_BUTTON,
18+
};

0 commit comments

Comments
 (0)