From 03071a79fec9320d12487ad0e0044c0d6ee1e5d0 Mon Sep 17 00:00:00 2001 From: byronluk Date: Sun, 28 Oct 2018 12:18:59 -0700 Subject: [PATCH 1/3] rename colliding let bindings with for loop init --- .../src/index.js | 15 +++++++++++++-- .../test/fixtures/general/issue-8498/input.js | 4 ++++ .../test/fixtures/general/issue-8498/output.js | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/input.js create mode 100644 packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/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 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/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/input.js new file mode 100644 index 000000000000..37a3d21033fb --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/input.js @@ -0,0 +1,4 @@ +for (let i = 0; i < 3; i++) { + let i = 'abc'; + console.log(i); +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/output.js new file mode 100644 index 000000000000..8b2115d91c38 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/output.js @@ -0,0 +1,4 @@ +for (var i = 0; i < 3; i++) { + var _i = 'abc'; + console.log(_i); +} From c78ff92dcad6ee72b704446ea092e9306ef7a103 Mon Sep 17 00:00:00 2001 From: byronluk Date: Tue, 30 Oct 2018 23:05:34 -0700 Subject: [PATCH 2/3] added complex test case to check if loop init collisions were handled correctly --- .../issue-8498-loop-init-collision-destructuring/input.js | 3 +++ .../options.json | 3 +++ .../issue-8498-loop-init-collision-destructuring/output.js | 5 +++++ .../{issue-8498 => issue-8498-loop-init-collision}/input.js | 0 .../{issue-8498 => issue-8498-loop-init-collision}/output.js | 0 5 files changed, 11 insertions(+) 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 rename packages/babel-plugin-transform-block-scoping/test/fixtures/general/{issue-8498 => issue-8498-loop-init-collision}/input.js (100%) rename packages/babel-plugin-transform-block-scoping/test/fixtures/general/{issue-8498 => issue-8498-loop-init-collision}/output.js (100%) 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..6d7c0add660b --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/input.js @@ -0,0 +1,3 @@ +for (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..84e28c07f51e --- /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"] +} 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..3424400acde7 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision-destructuring/output.js @@ -0,0 +1,5 @@ +for (let a, _ref = {}, b = _ref.b;;) { + let a, + _ref2 = {}, + b = _ref2.b; +} diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js similarity index 100% rename from packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/input.js rename to packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/input.js diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js similarity index 100% rename from packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498/output.js rename to packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-8498-loop-init-collision/output.js From d286d001c275fb9f02f71760572597c20d29fb32 Mon Sep 17 00:00:00 2001 From: byronluk Date: Wed, 31 Oct 2018 08:22:45 -0700 Subject: [PATCH 3/3] updated test files --- .../input.js | 4 ++++ .../options.json | 2 +- .../output.js | 12 +++++++++--- .../general/issue-8498-loop-init-collision/input.js | 6 +++++- .../general/issue-8498-loop-init-collision/output.js | 3 +++ 5 files changed, 22 insertions(+), 5 deletions(-) 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 index 6d7c0add660b..7d59ce437b19 100644 --- 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 @@ -1,3 +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 index 84e28c07f51e..9df3780bbc43 100644 --- 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 @@ -1,3 +1,3 @@ { - "plugins": ["transform-destructuring"] + "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 index 3424400acde7..d69de3a075a2 100644 --- 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 @@ -1,5 +1,11 @@ -for (let a, _ref = {}, b = _ref.b;;) { - let a, +for (var a, _ref = {}, b = _ref.b;;) { + var _a = void 0, _ref2 = {}, - b = _ref2.b; + _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 index 37a3d21033fb..9a2f0f21ecde 100644 --- 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 @@ -1,4 +1,8 @@ for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); -} \ No newline at end of file + + { + 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 index 8b2115d91c38..a08721ee5e33 100644 --- 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 @@ -1,4 +1,7 @@ for (var i = 0; i < 3; i++) { var _i = 'abc'; console.log(_i); + { + var _i2 = "hello"; + } }