From 0d9e77f559301bb75e1f64d250bcabf3dc1781a9 Mon Sep 17 00:00:00 2001 From: Byron Luk Date: Wed, 31 Oct 2018 12:28:36 -0700 Subject: [PATCH] rename colliding let bindings with for loop init (#8937) * rename colliding let bindings with for loop init * added complex test case to check if loop init collisions were handled correctly * updated test files --- .../src/index.js | 15 +++++++++++++-- .../input.js | 7 +++++++ .../options.json | 3 +++ .../output.js | 11 +++++++++++ .../issue-8498-loop-init-collision/input.js | 8 ++++++++ .../issue-8498-loop-init-collision/output.js | 7 +++++++ 6 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/input.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/options.json create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/output.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js diff --git a/packages/babel-plugin-transform-block-scoping/src/index.js b/packages/babel-plugin-transform-block-scoping/src/index.js index 6eb209a0d0..a72bd1a28e 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 0000000000..7d59ce437b --- /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 0000000000..9df3780bbc --- /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 0000000000..d69de3a075 --- /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 0000000000..9a2f0f21ec --- /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 0000000000..a08721ee5e --- /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"; + } +}