Skip to content

Commit

Permalink
Correctly error on enum member values referring to identifiers shadow…
Browse files Browse the repository at this point in the history
…ing `Infinity` and `NaN` (#55018)
  • Loading branch information
Andarist committed Aug 2, 2023
1 parent 30fe6ad commit 1481750
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/compiler/checker.ts
Expand Up @@ -43854,11 +43854,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return +(expr as NumericLiteral).text;
case SyntaxKind.ParenthesizedExpression:
return evaluate((expr as ParenthesizedExpression).expression, location);
case SyntaxKind.Identifier:
if (isInfinityOrNaNString((expr as Identifier).escapedText)) {
return +((expr as Identifier).escapedText);
case SyntaxKind.Identifier: {
const identifier = expr as Identifier;
if (isInfinityOrNaNString(identifier.escapedText) && (resolveEntityName(identifier, SymbolFlags.Value, /*ignoreErrors*/ true) === getGlobalSymbol(identifier.escapedText, SymbolFlags.Value, /*diagnostic*/ undefined))) {
return +(identifier.escapedText);
}
// falls through
}
case SyntaxKind.PropertyAccessExpression:
if (isEntityNameExpression(expr)) {
const symbol = resolveEntityName(expr, SymbolFlags.Value, /*ignoreErrors*/ true);
Expand Down
25 changes: 25 additions & 0 deletions tests/baselines/reference/enumShadowedInfinityNaN.errors.txt
@@ -0,0 +1,25 @@
enumShadowedInfinityNaN.ts(6,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
enumShadowedInfinityNaN.ts(13,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.


==== enumShadowedInfinityNaN.ts (2 errors) ====
// https://github.com/microsoft/TypeScript/issues/54981

{
let Infinity = {};
enum En {
X = Infinity
~~~~~~~~
!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
}
}

{
let NaN = {};
enum En {
X = NaN
~~~
!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
}
}

36 changes: 36 additions & 0 deletions tests/baselines/reference/enumShadowedInfinityNaN.js
@@ -0,0 +1,36 @@
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////

//// [enumShadowedInfinityNaN.ts]
// https://github.com/microsoft/TypeScript/issues/54981

{
let Infinity = {};
enum En {
X = Infinity
}
}

{
let NaN = {};
enum En {
X = NaN
}
}


//// [enumShadowedInfinityNaN.js]
// https://github.com/microsoft/TypeScript/issues/54981
{
var Infinity_1 = {};
var En = void 0;
(function (En) {
En[En["X"] = Infinity_1] = "X";
})(En || (En = {}));
}
{
var NaN_1 = {};
var En = void 0;
(function (En) {
En[En["X"] = NaN_1] = "X";
})(En || (En = {}));
}
31 changes: 31 additions & 0 deletions tests/baselines/reference/enumShadowedInfinityNaN.symbols
@@ -0,0 +1,31 @@
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////

=== enumShadowedInfinityNaN.ts ===
// https://github.com/microsoft/TypeScript/issues/54981

{
let Infinity = {};
>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5))

enum En {
>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 3, 20))

X = Infinity
>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 4, 11))
>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5))
}
}

{
let NaN = {};
>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5))

enum En {
>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 10, 15))

X = NaN
>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 11, 11))
>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5))
}
}

33 changes: 33 additions & 0 deletions tests/baselines/reference/enumShadowedInfinityNaN.types
@@ -0,0 +1,33 @@
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////

=== enumShadowedInfinityNaN.ts ===
// https://github.com/microsoft/TypeScript/issues/54981

{
let Infinity = {};
>Infinity : {}
>{} : {}

enum En {
>En : En

X = Infinity
>X : En.X
>Infinity : {}
}
}

{
let NaN = {};
>NaN : {}
>{} : {}

enum En {
>En : En

X = NaN
>X : En.X
>NaN : {}
}
}

15 changes: 15 additions & 0 deletions tests/cases/conformance/enums/enumShadowedInfinityNaN.ts
@@ -0,0 +1,15 @@
// https://github.com/microsoft/TypeScript/issues/54981

{
let Infinity = {};
enum En {
X = Infinity
}
}

{
let NaN = {};
enum En {
X = NaN
}
}

0 comments on commit 1481750

Please sign in to comment.