Correctly error on enum member values referring to identifiers shadowing Infinity and NaN (#55018)

This commit is contained in:
Mateusz Burzyński 2023-08-03 00:55:55 +02:00 committed by GitHub
parent 30fe6ada02
commit 1481750043
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 145 additions and 3 deletions

View File

@ -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);

View File

@ -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.
}
}

View File

@ -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 = {}));
}

View File

@ -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))
}
}

View File

@ -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 : {}
}
}

View File

@ -0,0 +1,15 @@
// https://github.com/microsoft/TypeScript/issues/54981
{
let Infinity = {};
enum En {
X = Infinity
}
}
{
let NaN = {};
enum En {
X = NaN
}
}