Skip to content

Commit

Permalink
Fix Numeric Literals Emission
Browse files Browse the repository at this point in the history
  • Loading branch information
graphemecluster committed Dec 14, 2022
1 parent 2e13ddf commit e8b6e50
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 10 deletions.
7 changes: 5 additions & 2 deletions src/compiler/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2996,9 +2996,12 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
if (isNumericLiteral(expression)) {
// check if numeric literal is a decimal literal that was originally written with a dot
const text = getLiteralTextOfNode(expression as LiteralExpression, /*neverAsciiEscape*/ true, /*jsxAttributeEscape*/ false);
// If the number will be printed verbatim and it doesn't already contain a dot, add one
// If the number will be printed verbatim and it doesn't already contain a dot or an exponent indicator, add one
// if the expression doesn't have any comments that will be emitted.
return !(expression.numericLiteralFlags & ~TokenFlags.OctalOrContainsLeadingZero) && !stringContains(text, tokenToString(SyntaxKind.DotToken)!);
return !(expression.numericLiteralFlags & TokenFlags.WithSpecifier)
&& !stringContains(text, tokenToString(SyntaxKind.DotToken)!)
&& !stringContains(text, String.fromCharCode(CharacterCodes.E))
&& !stringContains(text, String.fromCharCode(CharacterCodes.e));
}
else if (isAccessExpression(expression)) {
// check if constant enum value is integer
Expand Down
6 changes: 3 additions & 3 deletions src/compiler/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2814,15 +2814,15 @@ export const enum TokenFlags {
/** @internal */
BinaryOrOctalSpecifier = BinarySpecifier | OctalSpecifier,
/** @internal */
OctalOrContainsLeadingZero = Octal | ContainsLeadingZero,
WithSpecifier = HexSpecifier | BinaryOrOctalSpecifier,
/** @internal */
StringLiteralFlags = HexEscape | UnicodeEscape | ExtendedUnicodeEscape | ContainsInvalidEscape,
/** @internal */
NumericLiteralFlags = Scientific | OctalOrContainsLeadingZero | HexSpecifier | BinaryOrOctalSpecifier | ContainsSeparator | ContainsInvalidSeparator,
NumericLiteralFlags = Scientific | Octal | ContainsLeadingZero | WithSpecifier | ContainsSeparator | ContainsInvalidSeparator,
/** @internal */
TemplateLiteralLikeFlags = HexEscape | UnicodeEscape | ExtendedUnicodeEscape | ContainsInvalidEscape,
/** @internal */
IsInvalid = OctalOrContainsLeadingZero | ContainsInvalidSeparator | ContainsInvalidEscape,
IsInvalid = Octal | ContainsLeadingZero | ContainsInvalidSeparator | ContainsInvalidEscape,
}

export interface NumericLiteral extends LiteralExpression, Declaration {
Expand Down
23 changes: 21 additions & 2 deletions tests/baselines/reference/propertyAccessNumericLiterals.errors.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,31 @@
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(6,1): error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(7,1): error TS1486: Decimals with leading zeros are not allowed.
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(8,2): error TS6188: Numeric separators are not allowed here.
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(10,1): error TS1486: Decimals with leading zeros are not allowed.
tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts(11,3): error TS6188: Numeric separators are not allowed here.


==== tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts (1 errors) ====
==== tests/cases/conformance/expressions/propertyAccess/propertyAccessNumericLiterals.ts (5 errors) ====
0xffffffff.toString();
0o01234.toString();
0b01101101.toString();
1234..toString();
1e0.toString();
000.toString();
~~~
!!! error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
!!! error TS1121: Octal literals are not allowed. Use the syntax '0o0'.
08.8e5.toString();
~~~~~~
!!! error TS1486: Decimals with leading zeros are not allowed.
0_8.8e5.toString();
~
!!! error TS6188: Numeric separators are not allowed here.
8.8e5.toString();
088e4.toString();
~~~~~
!!! error TS1486: Decimals with leading zeros are not allowed.
88_e4.toString();
~
!!! error TS6188: Numeric separators are not allowed here.
88e4.toString();
8_8e4.toString();
16 changes: 15 additions & 1 deletion tests/baselines/reference/propertyAccessNumericLiterals.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@
0b01101101.toString();
1234..toString();
1e0.toString();
000.toString();
000.toString();
08.8e5.toString();
0_8.8e5.toString();
8.8e5.toString();
088e4.toString();
88_e4.toString();
88e4.toString();
8_8e4.toString();

//// [propertyAccessNumericLiterals.js]
0xffffffff.toString();
Expand All @@ -13,3 +20,10 @@
1234..toString();
1e0.toString();
0..toString();
880000..toString();
880000..toString();
8.8e5.toString();
880000..toString();
880000..toString();
88e4.toString();
880000..toString();
28 changes: 28 additions & 0 deletions tests/baselines/reference/propertyAccessNumericLiterals.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,31 @@
>000.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

08.8e5.toString();
>08.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

0_8.8e5.toString();
>0_8.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

8.8e5.toString();
>8.8e5.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

088e4.toString();
>088e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

88_e4.toString();
>88_e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

88e4.toString();
>88e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

8_8e4.toString();
>8_8e4.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))

42 changes: 42 additions & 0 deletions tests/baselines/reference/propertyAccessNumericLiterals.types
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,45 @@
>000 : 0
>toString : (radix?: number) => string

08.8e5.toString();
>08.8e5.toString() : string
>08.8e5.toString : (radix?: number) => string
>08.8e5 : 880000
>toString : (radix?: number) => string

0_8.8e5.toString();
>0_8.8e5.toString() : string
>0_8.8e5.toString : (radix?: number) => string
>0_8.8e5 : 880000
>toString : (radix?: number) => string

8.8e5.toString();
>8.8e5.toString() : string
>8.8e5.toString : (radix?: number) => string
>8.8e5 : 880000
>toString : (radix?: number) => string

088e4.toString();
>088e4.toString() : string
>088e4.toString : (radix?: number) => string
>088e4 : 880000
>toString : (radix?: number) => string

88_e4.toString();
>88_e4.toString() : string
>88_e4.toString : (radix?: number) => string
>88_e4 : 880000
>toString : (radix?: number) => string

88e4.toString();
>88e4.toString() : string
>88e4.toString : (radix?: number) => string
>88e4 : 880000
>toString : (radix?: number) => string

8_8e4.toString();
>8_8e4.toString() : string
>8_8e4.toString : (radix?: number) => string
>8_8e4 : 880000
>toString : (radix?: number) => string

Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
// @target: es3
0xffffffff.toString();
0o01234.toString();
0b01101101.toString();
1234..toString();
1e0.toString();
000.toString();
000.toString();
08.8e5.toString();
0_8.8e5.toString();
8.8e5.toString();
088e4.toString();
88_e4.toString();
88e4.toString();
8_8e4.toString();

0 comments on commit e8b6e50

Please sign in to comment.