From 8ce5e766b7d0003087c89d82a62045fba314f69c Mon Sep 17 00:00:00 2001 From: Babel Bot <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 13 Sep 2023 07:43:45 +0800 Subject: [PATCH] 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);