From 088da9ea9d9465892467a7201017764fadab806b Mon Sep 17 00:00:00 2001 From: Fabian Cook Date: Thu, 8 Sep 2016 01:46:10 +1200 Subject: [PATCH 1/3] Allow Infinity and NaN to be used as an Enum property identifier --- src/compiler/checker.ts | 6 +++++- tests/baselines/reference/enumWithInfinityProperty.js | 11 +++++++++++ .../reference/enumWithInfinityProperty.symbols | 8 ++++++++ .../reference/enumWithInfinityProperty.types | 9 +++++++++ tests/baselines/reference/enumWithNaNProperty.js | 11 +++++++++++ tests/baselines/reference/enumWithNaNProperty.symbols | 8 ++++++++ tests/baselines/reference/enumWithNaNProperty.types | 9 +++++++++ tests/cases/compiler/enumWithInfinityProperty.ts | 3 +++ tests/cases/compiler/enumWithNaNProperty.ts | 3 +++ 9 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/enumWithInfinityProperty.js create mode 100644 tests/baselines/reference/enumWithInfinityProperty.symbols create mode 100644 tests/baselines/reference/enumWithInfinityProperty.types create mode 100644 tests/baselines/reference/enumWithNaNProperty.js create mode 100644 tests/baselines/reference/enumWithNaNProperty.symbols create mode 100644 tests/baselines/reference/enumWithNaNProperty.types create mode 100644 tests/cases/compiler/enumWithInfinityProperty.ts create mode 100644 tests/cases/compiler/enumWithNaNProperty.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index da0b09cc781b2..3910d658edf57 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10033,6 +10033,10 @@ namespace ts { return isTypeAny(type) || isTypeOfKind(type, kind); } + function isInfinityOrNaNString(name: string) : boolean { + return name === 'Infinity' || name === 'NaN'; + } + function isNumericLiteralName(name: string) { // The intent of numeric names is that // - they are names with text in a numeric form, and that @@ -16848,7 +16852,7 @@ namespace ts { } else { const text = getTextOfPropertyName(member.name); - if (isNumericLiteralName(text)) { + if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) { error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); } } diff --git a/tests/baselines/reference/enumWithInfinityProperty.js b/tests/baselines/reference/enumWithInfinityProperty.js new file mode 100644 index 0000000000000..2ab45fbd9bec1 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.js @@ -0,0 +1,11 @@ +//// [enumWithInfinityProperty.ts] +enum A { + Infinity = 1 +} + + +//// [enumWithInfinityProperty.js] +var A; +(function (A) { + A[A["Infinity"] = 1] = "Infinity"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithInfinityProperty.symbols b/tests/baselines/reference/enumWithInfinityProperty.symbols new file mode 100644 index 0000000000000..50b505ce26225 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithInfinityProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithInfinityProperty.ts, 0, 0)) + + Infinity = 1 +>Infinity : Symbol(A.Infinity, Decl(enumWithInfinityProperty.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithInfinityProperty.types b/tests/baselines/reference/enumWithInfinityProperty.types new file mode 100644 index 0000000000000..1f872916c15a3 --- /dev/null +++ b/tests/baselines/reference/enumWithInfinityProperty.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/enumWithInfinityProperty.ts === +enum A { +>A : A + + Infinity = 1 +>Infinity : A +>1 : number +} + diff --git a/tests/baselines/reference/enumWithNaNProperty.js b/tests/baselines/reference/enumWithNaNProperty.js new file mode 100644 index 0000000000000..ad3e5f3a7f210 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.js @@ -0,0 +1,11 @@ +//// [enumWithNaNProperty.ts] +enum A { + NaN = 1 +} + + +//// [enumWithNaNProperty.js] +var A; +(function (A) { + A[A["NaN"] = 1] = "NaN"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithNaNProperty.symbols b/tests/baselines/reference/enumWithNaNProperty.symbols new file mode 100644 index 0000000000000..a327d74b17cd6 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithNaNProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithNaNProperty.ts, 0, 0)) + + NaN = 1 +>NaN : Symbol(A.NaN, Decl(enumWithNaNProperty.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithNaNProperty.types b/tests/baselines/reference/enumWithNaNProperty.types new file mode 100644 index 0000000000000..0d825a55eedc6 --- /dev/null +++ b/tests/baselines/reference/enumWithNaNProperty.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/enumWithNaNProperty.ts === +enum A { +>A : A + + NaN = 1 +>NaN : A +>1 : number +} + diff --git a/tests/cases/compiler/enumWithInfinityProperty.ts b/tests/cases/compiler/enumWithInfinityProperty.ts new file mode 100644 index 0000000000000..6c9630705ede1 --- /dev/null +++ b/tests/cases/compiler/enumWithInfinityProperty.ts @@ -0,0 +1,3 @@ +enum A { + Infinity = 1 +} diff --git a/tests/cases/compiler/enumWithNaNProperty.ts b/tests/cases/compiler/enumWithNaNProperty.ts new file mode 100644 index 0000000000000..11636f0510c1f --- /dev/null +++ b/tests/cases/compiler/enumWithNaNProperty.ts @@ -0,0 +1,3 @@ +enum A { + NaN = 1 +} From 98ac4e4c51a0b7b8f75d5f854a3f890be9851573 Mon Sep 17 00:00:00 2001 From: Fabian Cook Date: Thu, 8 Sep 2016 09:21:34 +1200 Subject: [PATCH 2/3] Allow -Infinity as an enum property name --- src/compiler/checker.ts | 2 +- .../reference/enumWithNegativeInfinityProperty.js | 11 +++++++++++ .../enumWithNegativeInfinityProperty.symbols | 7 +++++++ .../reference/enumWithNegativeInfinityProperty.types | 8 ++++++++ .../compiler/enumWithNegativeInfinityProperty.ts | 3 +++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/enumWithNegativeInfinityProperty.js create mode 100644 tests/baselines/reference/enumWithNegativeInfinityProperty.symbols create mode 100644 tests/baselines/reference/enumWithNegativeInfinityProperty.types create mode 100644 tests/cases/compiler/enumWithNegativeInfinityProperty.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3910d658edf57..e2377db8f3126 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10034,7 +10034,7 @@ namespace ts { } function isInfinityOrNaNString(name: string) : boolean { - return name === 'Infinity' || name === 'NaN'; + return name === 'Infinity' || name === '-Infinity' || name === 'NaN'; } function isNumericLiteralName(name: string) { diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.js b/tests/baselines/reference/enumWithNegativeInfinityProperty.js new file mode 100644 index 0000000000000..867545fb14aa9 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.js @@ -0,0 +1,11 @@ +//// [enumWithNegativeInfinityProperty.ts] +enum A { + "-Infinity" = 1 +} + + +//// [enumWithNegativeInfinityProperty.js] +var A; +(function (A) { + A[A["-Infinity"] = 1] = "-Infinity"; +})(A || (A = {})); diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols b/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols new file mode 100644 index 0000000000000..51c61196ca6b6 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/enumWithNegativeInfinityProperty.ts === +enum A { +>A : Symbol(A, Decl(enumWithNegativeInfinityProperty.ts, 0, 0)) + + "-Infinity" = 1 +} + diff --git a/tests/baselines/reference/enumWithNegativeInfinityProperty.types b/tests/baselines/reference/enumWithNegativeInfinityProperty.types new file mode 100644 index 0000000000000..bc09333075d22 --- /dev/null +++ b/tests/baselines/reference/enumWithNegativeInfinityProperty.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/enumWithNegativeInfinityProperty.ts === +enum A { +>A : A + + "-Infinity" = 1 +>1 : number +} + diff --git a/tests/cases/compiler/enumWithNegativeInfinityProperty.ts b/tests/cases/compiler/enumWithNegativeInfinityProperty.ts new file mode 100644 index 0000000000000..057c3a5e6691e --- /dev/null +++ b/tests/cases/compiler/enumWithNegativeInfinityProperty.ts @@ -0,0 +1,3 @@ +enum A { + "-Infinity" = 1 +} From 5714440fffb2ef9b8e3f2de2189d46421e14bd56 Mon Sep 17 00:00:00 2001 From: Fabian Cook Date: Thu, 8 Sep 2016 09:33:31 +1200 Subject: [PATCH 3/3] Correct strings based on linting rules --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e2377db8f3126..565d01bf024dd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10033,8 +10033,8 @@ namespace ts { return isTypeAny(type) || isTypeOfKind(type, kind); } - function isInfinityOrNaNString(name: string) : boolean { - return name === 'Infinity' || name === '-Infinity' || name === 'NaN'; + function isInfinityOrNaNString(name: string): boolean { + return name === "Infinity" || name === "-Infinity" || name === "NaN"; } function isNumericLiteralName(name: string) {