Skip to content

Commit e8b6e50

Browse files
Fix Numeric Literals Emission
1 parent 2e13ddf commit e8b6e50

7 files changed

+122
-10
lines changed

src/compiler/emitter.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -2996,9 +2996,12 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
29962996
if (isNumericLiteral(expression)) {
29972997
// check if numeric literal is a decimal literal that was originally written with a dot
29982998
const text = getLiteralTextOfNode(expression as LiteralExpression, /*neverAsciiEscape*/ true, /*jsxAttributeEscape*/ false);
2999-
// If the number will be printed verbatim and it doesn't already contain a dot, add one
2999+
// If the number will be printed verbatim and it doesn't already contain a dot or an exponent indicator, add one
30003000
// if the expression doesn't have any comments that will be emitted.
3001-
return !(expression.numericLiteralFlags & ~TokenFlags.OctalOrContainsLeadingZero) && !stringContains(text, tokenToString(SyntaxKind.DotToken)!);
3001+
return !(expression.numericLiteralFlags & TokenFlags.WithSpecifier)
3002+
&& !stringContains(text, tokenToString(SyntaxKind.DotToken)!)
3003+
&& !stringContains(text, String.fromCharCode(CharacterCodes.E))
3004+
&& !stringContains(text, String.fromCharCode(CharacterCodes.e));
30023005
}
30033006
else if (isAccessExpression(expression)) {
30043007
// check if constant enum value is integer

src/compiler/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2814,15 +2814,15 @@ export const enum TokenFlags {
28142814
/** @internal */
28152815
BinaryOrOctalSpecifier = BinarySpecifier | OctalSpecifier,
28162816
/** @internal */
2817-
OctalOrContainsLeadingZero = Octal | ContainsLeadingZero,
2817+
WithSpecifier = HexSpecifier | BinaryOrOctalSpecifier,
28182818
/** @internal */
28192819
StringLiteralFlags = HexEscape | UnicodeEscape | ExtendedUnicodeEscape | ContainsInvalidEscape,
28202820
/** @internal */
2821-
NumericLiteralFlags = Scientific | OctalOrContainsLeadingZero | HexSpecifier | BinaryOrOctalSpecifier | ContainsSeparator | ContainsInvalidSeparator,
2821+
NumericLiteralFlags = Scientific | Octal | ContainsLeadingZero | WithSpecifier | ContainsSeparator | ContainsInvalidSeparator,
28222822
/** @internal */
28232823
TemplateLiteralLikeFlags = HexEscape | UnicodeEscape | ExtendedUnicodeEscape | ContainsInvalidEscape,
28242824
/** @internal */
2825-
IsInvalid = OctalOrContainsLeadingZero | ContainsInvalidSeparator | ContainsInvalidEscape,
2825+
IsInvalid = Octal | ContainsLeadingZero | ContainsInvalidSeparator | ContainsInvalidEscape,
28262826
}
28272827

28282828
export interface NumericLiteral extends LiteralExpression, Declaration {
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
11
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(6,1): error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
2+
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(7,1): error TS1486: Decimals with leading zeros are not allowed.
3+
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(8,2): error TS6188: Numeric separators are not allowed here.
4+
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(10,1): error TS1486: Decimals with leading zeros are not allowed.
5+
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(11,3): error TS6188: Numeric separators are not allowed here.
26

37

4-
==== tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts (1 errors) ====
8+
==== tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts (5 errors) ====
59
0xffffffff.toString();
610
0o01234.toString();
711
0b01101101.toString();
812
1234..toString();
913
1e0.toString();
1014
000.toString();
1115
~~~
12-
!!! error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
16+
!!! error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
17+
08.8e5.toString();
18+
~~~~~~
19+
!!! error TS1486: Decimals with leading zeros are not allowed.
20+
0_8.8e5.toString();
21+
~
22+
!!! error TS6188: Numeric separators are not allowed here.
23+
8.8e5.toString();
24+
088e4.toString();
25+
~~~~~
26+
!!! error TS1486: Decimals with leading zeros are not allowed.
27+
88_e4.toString();
28+
~
29+
!!! error TS6188: Numeric separators are not allowed here.
30+
88e4.toString();
31+
8_8e4.toString();

tests/baselines/reference/propertyAccessNumericLiterals.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
0b01101101.toString();
55
1234..toString();
66
1e0.toString();
7-
000.toString();
7+
000.toString();
8+
08.8e5.toString();
9+
0_8.8e5.toString();
10+
8.8e5.toString();
11+
088e4.toString();
12+
88_e4.toString();
13+
88e4.toString();
14+
8_8e4.toString();
815

916
//// [propertyAccessNumericLiterals.js]
1017
0xffffffff.toString();
@@ -13,3 +20,10 @@
1320
1234..toString();
1421
1e0.toString();
1522
0..toString();
23+
880000..toString();
24+
880000..toString();
25+
8.8e5.toString();
26+
880000..toString();
27+
880000..toString();
28+
88e4.toString();
29+
880000..toString();

tests/baselines/reference/propertyAccessNumericLiterals.symbols

+28
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,31 @@
2323
>000.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
2424
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
2525

26+
08.8e5.toString();
27+
>08.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
28+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
29+
30+
0_8.8e5.toString();
31+
>0_8.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
32+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
33+
34+
8.8e5.toString();
35+
>8.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
36+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
37+
38+
088e4.toString();
39+
>088e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
40+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
41+
42+
88_e4.toString();
43+
>88_e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
44+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
45+
46+
88e4.toString();
47+
>88e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
48+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
49+
50+
8_8e4.toString();
51+
>8_8e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
52+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
53+

tests/baselines/reference/propertyAccessNumericLiterals.types

+42
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,45 @@
3535
>000 : 0
3636
>toString : (radix?: number) => string
3737

38+
08.8e5.toString();
39+
>08.8e5.toString() : string
40+
>08.8e5.toString : (radix?: number) => string
41+
>08.8e5 : 880000
42+
>toString : (radix?: number) => string
43+
44+
0_8.8e5.toString();
45+
>0_8.8e5.toString() : string
46+
>0_8.8e5.toString : (radix?: number) => string
47+
>0_8.8e5 : 880000
48+
>toString : (radix?: number) => string
49+
50+
8.8e5.toString();
51+
>8.8e5.toString() : string
52+
>8.8e5.toString : (radix?: number) => string
53+
>8.8e5 : 880000
54+
>toString : (radix?: number) => string
55+
56+
088e4.toString();
57+
>088e4.toString() : string
58+
>088e4.toString : (radix?: number) => string
59+
>088e4 : 880000
60+
>toString : (radix?: number) => string
61+
62+
88_e4.toString();
63+
>88_e4.toString() : string
64+
>88_e4.toString : (radix?: number) => string
65+
>88_e4 : 880000
66+
>toString : (radix?: number) => string
67+
68+
88e4.toString();
69+
>88e4.toString() : string
70+
>88e4.toString : (radix?: number) => string
71+
>88e4 : 880000
72+
>toString : (radix?: number) => string
73+
74+
8_8e4.toString();
75+
>8_8e4.toString() : string
76+
>8_8e4.toString : (radix?: number) => string
77+
>8_8e4 : 880000
78+
>toString : (radix?: number) => string
79+
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
// @target: es3
21
0xffffffff.toString();
32
0o01234.toString();
43
0b01101101.toString();
54
1234..toString();
65
1e0.toString();
7-
000.toString();
6+
000.toString();
7+
08.8e5.toString();
8+
0_8.8e5.toString();
9+
8.8e5.toString();
10+
088e4.toString();
11+
88_e4.toString();
12+
88e4.toString();
13+
8_8e4.toString();

0 commit comments

Comments
 (0)