From b7f04acda5d2e6f8429414793b06388c5e0f1e9d Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Mon, 18 Sep 2023 21:05:40 +0800 Subject: [PATCH] fix: `transform-block-scoping` captures the variables of the method in the loop (#15962) fix --- .../src/loop.ts | 4 +++- .../general/loop-closure-in-method/exec.js | 15 +++++++++++++++ .../general/loop-closure-in-method/input.js | 15 +++++++++++++++ .../general/loop-closure-in-method/output.js | 16 ++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/exec.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/input.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/output.js diff --git a/packages/babel-plugin-transform-block-scoping/src/loop.ts b/packages/babel-plugin-transform-block-scoping/src/loop.ts index 1fbe72eadd26..5e9088b1593e 100644 --- a/packages/babel-plugin-transform-block-scoping/src/loop.ts +++ b/packages/babel-plugin-transform-block-scoping/src/loop.ts @@ -75,7 +75,9 @@ function relativeLoopLocation(path: NodePath, loopPath: NodePath) { let inClosure = false; for (let currPath = path; currPath; currPath = currPath.parentPath) { - if (currPath.isFunction() || currPath.isClass()) inClosure = true; + if (currPath.isFunction() || currPath.isClass() || currPath.isMethod()) { + inClosure = true; + } if (currPath === bodyPath) { return { inBody: true, inClosure }; } else if (currPath === loopPath) { diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/exec.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/exec.js new file mode 100644 index 000000000000..d07c73566b23 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/exec.js @@ -0,0 +1,15 @@ +var objects = []; +var i2 = 0; +for (var i = 0; i < 10; i++) { + let captured = i2; + i2++; + + objects.push({ + foo() { + return captured; + } + }); +} + +expect(objects[0].foo()).toBe(0); +expect(objects[1].foo()).toBe(1); diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/input.js new file mode 100644 index 000000000000..d07c73566b23 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/input.js @@ -0,0 +1,15 @@ +var objects = []; +var i2 = 0; +for (var i = 0; i < 10; i++) { + let captured = i2; + i2++; + + objects.push({ + foo() { + return captured; + } + }); +} + +expect(objects[0].foo()).toBe(0); +expect(objects[1].foo()).toBe(1); diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/output.js new file mode 100644 index 000000000000..3deae8b9b9a3 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/loop-closure-in-method/output.js @@ -0,0 +1,16 @@ +var objects = []; +var i2 = 0; +var _loop = function () { + var captured = i2; + i2++; + objects.push({ + foo() { + return captured; + } + }); +}; +for (var i = 0; i < 10; i++) { + _loop(); +} +expect(objects[0].foo()).toBe(0); +expect(objects[1].foo()).toBe(1);