diff --git a/packages/babel-plugin-transform-block-scoping/src/index.js b/packages/babel-plugin-transform-block-scoping/src/index.js index 6eb209a0d058..a72bd1a28e3b 100644 --- a/packages/babel-plugin-transform-block-scoping/src/index.js +++ b/packages/babel-plugin-transform-block-scoping/src/index.js @@ -460,7 +460,9 @@ class BlockScoping { remap() { const letRefs = this.letReferences; + const outsideLetRefs = this.outsideLetReferences; const scope = this.scope; + const blockPathScope = this.blockPath.scope; // alright, so since we aren't wrapping this block in a closure // we have to check if any of our let variables collide with @@ -481,11 +483,20 @@ class BlockScoping { scope.rename(ref.name); } - if (this.blockPath.scope.hasOwnBinding(key)) { - this.blockPath.scope.rename(ref.name); + if (blockPathScope.hasOwnBinding(key)) { + blockPathScope.rename(ref.name); } } } + + for (const key in outsideLetRefs) { + const ref = letRefs[key]; + // check for collisions with a for loop's init variable and the enclosing scope's bindings + // https://github.com/babel/babel/issues/8498 + if (isInLoop(this.blockPath) && blockPathScope.hasOwnBinding(key)) { + blockPathScope.rename(ref.name); + } + } } wrapClosure() { diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/input.js new file mode 100644 index 000000000000..7d59ce437b19 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/input.js @@ -0,0 +1,7 @@ +for (let a, { b } = {};;) { + let a, { b } = {}; + + { + let a, { b } = {}; + } +} diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/options.json b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/options.json new file mode 100644 index 000000000000..9df3780bbc43 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-destructuring", "transform-block-scoping"] +} diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/output.js new file mode 100644 index 000000000000..d69de3a075a2 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/output.js @@ -0,0 +1,11 @@ +for (var a, _ref = {}, b = _ref.b;;) { + var _a = void 0, + _ref2 = {}, + _b = _ref2.b; + + { + var _a2 = void 0, + _ref3 = {}, + _b2 = _ref3.b; + } +} diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js new file mode 100644 index 000000000000..9a2f0f21ecde --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js @@ -0,0 +1,8 @@ +for (let i = 0; i < 3; i++) { + let i = 'abc'; + console.log(i); + + { + let i = "hello"; + } +} diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js new file mode 100644 index 000000000000..a08721ee5e33 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js @@ -0,0 +1,7 @@ +for (var i = 0; i < 3; i++) { + var _i = 'abc'; + console.log(_i); + { + var _i2 = "hello"; + } +}