From 275286e83ba4a411130853887ae0dfec0d93beec Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Thu, 2 Jun 2022 23:36:32 +0200 Subject: [PATCH 1/2] Add test --- .../integration/scope-hoisting/es6/rename-member-prop/a.js | 4 +++- .../integration/scope-hoisting/es6/rename-member-prop/b.js | 1 + packages/core/integration-tests/test/scope-hoisting.js | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/b.js diff --git a/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/a.js b/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/a.js index a6b6db35cac..cdb15af9a9f 100644 --- a/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/a.js +++ b/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/a.js @@ -1,5 +1,7 @@ +import {B} from "./b.js"; + export function foo(x) { - return [x.foo, x?.foo]; + return [x.foo, x?.foo, x[B], x?.[B]]; } output = foo; diff --git a/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/b.js b/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/b.js new file mode 100644 index 00000000000..213ef15c0d8 --- /dev/null +++ b/packages/core/integration-tests/test/integration/scope-hoisting/es6/rename-member-prop/b.js @@ -0,0 +1 @@ +export const B = "bar"; diff --git a/packages/core/integration-tests/test/scope-hoisting.js b/packages/core/integration-tests/test/scope-hoisting.js index cfe6d356432..619926bafed 100644 --- a/packages/core/integration-tests/test/scope-hoisting.js +++ b/packages/core/integration-tests/test/scope-hoisting.js @@ -186,7 +186,7 @@ describe('scope hoisting', function () { assert.deepEqual(output, ['1', '2']); }); - it("doesn't rename member expression properties", async function () { + it('correctly renames member expression properties', async function () { let b = await bundle( path.join( __dirname, @@ -195,7 +195,7 @@ describe('scope hoisting', function () { ); let output = await run(b); - assert.deepEqual(output({foo: 12}), [12, 12]); + assert.deepEqual(output({foo: 12, bar: 34}), [12, 12, 34, 34]); }); it('supports renaming imports', async function () { From 21bf6d1f34beeedc7f9c9ca1f91e79a530f43a01 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Thu, 2 Jun 2022 23:37:54 +0200 Subject: [PATCH 2/2] Fix --- packages/transformers/js/core/src/hoist.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/transformers/js/core/src/hoist.rs b/packages/transformers/js/core/src/hoist.rs index d29c6e1bf7f..3b2ccec095f 100644 --- a/packages/transformers/js/core/src/hoist.rs +++ b/packages/transformers/js/core/src/hoist.rs @@ -522,12 +522,18 @@ impl<'a> Fold for Hoist<'a> { question_dot_token: opt.question_dot_token, base: match opt.base { OptChainBase::Call(call) => OptChainBase::Call(call.fold_with(self)), - OptChainBase::Member(member) => OptChainBase::Member(MemberExpr { - span: member.span, - obj: member.obj.fold_with(self), - // Don't visit member.prop so we avoid the ident visitor. - prop: member.prop, - }), + OptChainBase::Member(member) => { + if match_property_name(&member).is_some() { + OptChainBase::Member(MemberExpr { + span: member.span, + obj: member.obj.fold_with(self), + // Don't visit member.prop so we avoid the ident visitor. + prop: member.prop, + }) + } else { + OptChainBase::Member(member.fold_children_with(self)) + } + } }, }); }