Skip to content

Commit

Permalink
Fix references to enum values with merging (#16137)
Browse files Browse the repository at this point in the history
* Add test

* Fix `path.resolve()` usage in enum transform

* Fix references to enum values with merging

* One more test
  • Loading branch information
nicolo-ribaudo committed Nov 30, 2023
1 parent f8a98c7 commit 57535c3
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 9 deletions.
16 changes: 7 additions & 9 deletions packages/babel-plugin-transform-typescript/src/enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,9 @@ const enumSelfReferenceVisitor = {
};

export function translateEnumValues(path: NodePath<t.TSEnumDeclaration>, t: t) {
const seen: PreviousEnumMembers = new Map();
const bindingIdentifier = path.scope.getBindingIdentifier(path.node.id.name);
const seen: PreviousEnumMembers = ENUMS.get(bindingIdentifier) ?? new Map();

// Start at -1 so the first enum member is its increment, 0.
let constValue: number | string | undefined = -1;
let lastName: string;
Expand Down Expand Up @@ -320,15 +322,11 @@ function computeConstantValue(
}

if (seen.has(path.node)) return;
seen.add(path.node);

const bindingInitPath = path.resolve(); // It only resolves constant bindings
if (bindingInitPath) {
seen.add(path.node);

value = computeConstantValue(bindingInitPath, undefined, seen);
prevMembers?.set(name, value);
return value;
}
value = computeConstantValue(path.resolve(), prevMembers, seen);
prevMembers?.set(name, value);
return value;
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Cat = 10;
const Dog = 20;

enum Animals {
Cat = 1
}

enum Animals {
Dog = 2
}

enum Animals {
CatDog = Cat | Dog
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Cat = 10;
const Dog = 20;
var Animals = /*#__PURE__*/function (Animals) {
Animals[Animals["Cat"] = 1] = "Cat";
return Animals;
}(Animals || {});
Animals = /*#__PURE__*/function (Animals) {
Animals[Animals["Dog"] = 2] = "Dog";
return Animals;
}(Animals || {});
Animals = /*#__PURE__*/function (Animals) {
Animals[Animals["CatDog"] = 3] = "CatDog";
return Animals;
}(Animals || {});
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
enum Animals {
Cat = 1,
Dog = 2
}
enum Animals {
CatDog = Cat - Dog
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var Animals = /*#__PURE__*/function (Animals) {
Animals[Animals["Cat"] = 1] = "Cat";
Animals[Animals["Dog"] = 2] = "Dog";
return Animals;
}(Animals || {});
Animals = /*#__PURE__*/function (Animals) {
Animals[Animals["CatDog"] = -1] = "CatDog";
return Animals;
}(Animals || {});

0 comments on commit 57535c3

Please sign in to comment.