Skip to content

Commit d686a16

Browse files
authored
fix(3809): Enum member after NaN must have initializer in tsgo, which is not in ts6.0 (#3830)
1 parent 49f210f commit d686a16

5 files changed

Lines changed: 57 additions & 6 deletions

File tree

internal/checker/checker.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23769,22 +23769,23 @@ func (c *Checker) computeEnumMemberValues(node *ast.Node) {
2376923769
nodeLinks := c.nodeLinks.Get(node)
2377023770
if !(nodeLinks.flags&NodeCheckFlagsEnumValuesComputed != 0) {
2377123771
nodeLinks.flags |= NodeCheckFlagsEnumValuesComputed
23772-
var autoValue jsnum.Number
23772+
autoValue := new(jsnum.Number)
2377323773
var previous *ast.Node
2377423774
for _, member := range node.Members() {
2377523775
result := c.computeEnumMemberValue(member, autoValue, previous)
2377623776
c.enumMemberLinks.Get(member).value = result
2377723777
if value, isNumber := result.Value.(jsnum.Number); isNumber {
23778-
autoValue = value + 1
23778+
nextValue := value + 1
23779+
autoValue = &nextValue
2377923780
} else {
23780-
autoValue = jsnum.NaN()
23781+
autoValue = nil
2378123782
}
2378223783
previous = member
2378323784
}
2378423785
}
2378523786
}
2378623787

23787-
func (c *Checker) computeEnumMemberValue(member *ast.Node, autoValue jsnum.Number, previous *ast.Node) evaluator.Result {
23788+
func (c *Checker) computeEnumMemberValue(member *ast.Node, autoValue *jsnum.Number, previous *ast.Node) evaluator.Result {
2378823789
if ast.IsComputedNonLiteralName(member.Name()) {
2378923790
c.error(member.Name(), diagnostics.Computed_property_names_are_not_allowed_in_enums)
2379023791
} else if ast.IsBigIntLiteral(member.Name()) {
@@ -23807,7 +23808,7 @@ func (c *Checker) computeEnumMemberValue(member *ast.Node, autoValue jsnum.Numbe
2380723808
// If the member is the first member in the enum declaration, it is assigned the value zero.
2380823809
// Otherwise, it is assigned the value of the immediately preceding member plus one, and an error
2380923810
// occurs if the immediately preceding member is not a constant enum member.
23810-
if autoValue.IsNaN() {
23811+
if autoValue == nil {
2381123812
c.error(member.Name(), diagnostics.Enum_member_must_have_initializer)
2381223813
return evaluator.NewResult(nil, false, false, false)
2381323814
}
@@ -23818,7 +23819,7 @@ func (c *Checker) computeEnumMemberValue(member *ast.Node, autoValue jsnum.Numbe
2381823819
c.error(member.Name(), diagnostics.Enum_member_following_a_non_literal_numeric_member_must_have_an_initializer_when_isolatedModules_is_enabled)
2381923820
}
2382023821
}
23821-
return evaluator.NewResult(autoValue, false, false, false)
23822+
return evaluator.NewResult(*autoValue, false, false, false)
2382223823
}
2382323824

2382423825
func (c *Checker) computeConstantEnumMemberValue(member *ast.Node) evaluator.Result {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [tests/cases/compiler/enumAutoIncrementValue.ts] ////
2+
3+
//// [a.ts]
4+
enum E {
5+
A = 0 / 0,
6+
B,
7+
}
8+
9+
10+
//// [a.js]
11+
"use strict";
12+
var E;
13+
(function (E) {
14+
E[E["A"] = NaN] = "A";
15+
E[E["B"] = NaN] = "B";
16+
})(E || (E = {}));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//// [tests/cases/compiler/enumAutoIncrementValue.ts] ////
2+
3+
=== a.ts ===
4+
enum E {
5+
>E : Symbol(E, Decl(a.ts, 0, 0))
6+
7+
A = 0 / 0,
8+
>A : Symbol(E.A, Decl(a.ts, 0, 8))
9+
10+
B,
11+
>B : Symbol(E.B, Decl(a.ts, 1, 14))
12+
}
13+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [tests/cases/compiler/enumAutoIncrementValue.ts] ////
2+
3+
=== a.ts ===
4+
enum E {
5+
>E : E
6+
7+
A = 0 / 0,
8+
>A : E.A
9+
>0 / 0 : number
10+
>0 : 0
11+
>0 : 0
12+
13+
B,
14+
>B : E.B
15+
}
16+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @filename: a.ts
2+
enum E {
3+
A = 0 / 0,
4+
B,
5+
}

0 commit comments

Comments
 (0)