From 59666e01271d22736d471fd137de5ac2dbd66d8b Mon Sep 17 00:00:00 2001 From: Dunqing Date: Thu, 13 Jun 2024 15:26:38 +0800 Subject: [PATCH] fix(transformer): do not rename accessible identifier references (#3623) close: #3620 In `Babel`, the expected output is: ```ts var x = 10; var Foo = function(Foo) { Foo[Foo['a'] = 10] = 'a'; Foo[Foo['b'] = 10] = 'b'; Foo[Foo['c'] = 30] = 'c'; return Foo; }(Foo || {}); ``` IMO, `Foo.b + x` is enough, because `x` is not a const variable. The output same as with `typescript` --- crates/oxc_transformer/src/typescript/enum.rs | 10 ++++++++++ tasks/transform_conformance/oxc.snap.md | 2 +- .../test/fixtures/enum-member-reference/input.ts | 7 +++++++ .../test/fixtures/enum-member-reference/output.js | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/input.ts create mode 100644 tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/output.js diff --git a/crates/oxc_transformer/src/typescript/enum.rs b/crates/oxc_transformer/src/typescript/enum.rs index 700e182895c5..6d4acc0c70d9 100644 --- a/crates/oxc_transformer/src/typescript/enum.rs +++ b/crates/oxc_transformer/src/typescript/enum.rs @@ -535,6 +535,16 @@ impl<'a, 'b> VisitMut<'a> for IdentifierReferenceRename<'a, 'b> { None } Expression::Identifier(ident) => { + // If the identifier is binding in current/parent scopes, + // and it is not a member of the enum, + // we don't need to rename it. + // `var c = 1; enum A { a = c }` -> `var c = 1; enum A { a = c } + if !self.previous_enum_members.contains_key(&ident.name) + && self.ctx.scopes().has_binding(self.ctx.current_scope_id(), &ident.name) + { + return; + } + // TODO: shadowed case, e.g. let ident = 1; ident; // ident is not an enum // enum_name.identifier let ident_reference = IdentifierReference::new(SPAN, self.enum_name.clone()); diff --git a/tasks/transform_conformance/oxc.snap.md b/tasks/transform_conformance/oxc.snap.md index 947c6824030c..3d0c586043e6 100644 --- a/tasks/transform_conformance/oxc.snap.md +++ b/tasks/transform_conformance/oxc.snap.md @@ -1,6 +1,6 @@ commit: 12619ffe -Passed: 3/3 +Passed: 4/4 # All Passed: * babel-plugin-transform-typescript diff --git a/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/input.ts b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/input.ts new file mode 100644 index 000000000000..760eef319d8a --- /dev/null +++ b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/input.ts @@ -0,0 +1,7 @@ +var x = 10; + +enum Foo { + a = 10, + b = a, + c = b + x, +} diff --git a/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/output.js b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/output.js new file mode 100644 index 000000000000..8dcfa9feeba4 --- /dev/null +++ b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-member-reference/output.js @@ -0,0 +1,7 @@ +var x = 10; +var Foo = function(Foo) { + Foo[Foo['a'] = 10] = 'a'; + Foo[Foo['b'] = 10] = 'b'; + Foo[Foo['c'] = Foo.b + x] = 'c'; + return Foo; +}(Foo || {}); \ No newline at end of file