From 7c2ee9df13db6b1d214296dd9361a70e7c9aef24 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Tue, 11 Jun 2024 15:34:03 +0800 Subject: [PATCH] fix(transformer): do not rename accessible identifier references --- 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 700e182895c5c..6d4acc0c70d98 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 7e3e0fd209ea8..d75f8f70df386 100644 --- a/tasks/transform_conformance/oxc.snap.md +++ b/tasks/transform_conformance/oxc.snap.md @@ -1,6 +1,6 @@ commit: 4bd1b2c2 -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 0000000000000..760eef319d8a9 --- /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 0000000000000..8dcfa9feeba4b --- /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