diff --git a/lib/6to5/transformation/templates/for-of-loose.js b/lib/6to5/transformation/templates/for-of-loose.js index 602dd90301..9b463868ce 100644 --- a/lib/6to5/transformation/templates/for-of-loose.js +++ b/lib/6to5/transformation/templates/for-of-loose.js @@ -2,6 +2,7 @@ for (var LOOP_OBJECT = OBJECT, IS_ARRAY = Array.isArray(LOOP_OBJECT), INDEX = 0, LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) { + var ID; if (IS_ARRAY) { if (INDEX >= LOOP_OBJECT.length) break; ID = LOOP_OBJECT[INDEX++]; diff --git a/lib/6to5/transformation/transformers/es6/for-of.js b/lib/6to5/transformation/transformers/es6/for-of.js index f8a3779d5a..0bbfd9fc83 100644 --- a/lib/6to5/transformation/transformers/es6/for-of.js +++ b/lib/6to5/transformation/transformers/es6/for-of.js @@ -20,11 +20,7 @@ exports.ForOfStatement = function (node, parent, scope, context, file) { // add the value declaration to the new loop body if (declar) { - if (build.shouldUnshift) { - block.body.unshift(declar); - } else { - block.body.push(declar); - } + block.body.push(declar); } // push the rest of the original loop body onto our new body @@ -45,9 +41,9 @@ var loose = function (node, parent, scope, context, file) { id = left; } else if (t.isVariableDeclaration(left)) { // for (var i of test) - id = left.declarations[0].id; + id = scope.generateUidIdentifier("ref"); declar = t.variableDeclaration(left.kind, [ - t.variableDeclarator(id) + t.variableDeclarator(left.declarations[0].id, id) ]); } else { throw file.errorWithNode(left, "Unknown node type " + left.type + " in ForOfStatement"); @@ -61,10 +57,15 @@ var loose = function (node, parent, scope, context, file) { ID: id }); + if (!declar) { + // no declaration so we need to remove the variable declaration at the top of + // the for-of-loose template + loop.body.body.shift(); + } + return { - shouldUnshift: true, - declar: declar, - loop: loop + declar: declar, + loop: loop }; }; diff --git a/test/fixtures/transformation/es6-for-of-loose/let/expected.js b/test/fixtures/transformation/es6-for-of-loose/let/expected.js index 261cb6bf7b..7bca26b4c8 100644 --- a/test/fixtures/transformation/es6-for-of-loose/let/expected.js +++ b/test/fixtures/transformation/es6-for-of-loose/let/expected.js @@ -1,13 +1,14 @@ "use strict"; for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var i = undefined; + var _ref; if (_isArray) { if (_i >= _iterator.length) break; - i = _iterator[_i++]; + _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; - i = _i.value; + _ref = _i.value; } -} + var i = _ref; +} \ No newline at end of file diff --git a/test/fixtures/transformation/es6-for-of-loose/multiple/expected.js b/test/fixtures/transformation/es6-for-of-loose/multiple/expected.js index 46d8e3f0aa..cf5042aacc 100644 --- a/test/fixtures/transformation/es6-for-of-loose/multiple/expected.js +++ b/test/fixtures/transformation/es6-for-of-loose/multiple/expected.js @@ -1,25 +1,27 @@ "use strict"; for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var i; + var _ref; if (_isArray) { if (_i >= _iterator.length) break; - i = _iterator[_i++]; + _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; - i = _i.value; + _ref = _i.value; } + var i = _ref; } for (var _iterator2 = numbers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { - var i; + var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; - i = _iterator2[_i2++]; + _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; - i = _i2.value; + _ref2 = _i2.value; } -} + var i = _ref2; +} \ No newline at end of file diff --git a/test/fixtures/transformation/es6-for-of-loose/var/expected.js b/test/fixtures/transformation/es6-for-of-loose/var/expected.js index d5dd9060d5..7bca26b4c8 100644 --- a/test/fixtures/transformation/es6-for-of-loose/var/expected.js +++ b/test/fixtures/transformation/es6-for-of-loose/var/expected.js @@ -1,13 +1,14 @@ "use strict"; for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var i; + var _ref; if (_isArray) { if (_i >= _iterator.length) break; - i = _iterator[_i++]; + _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; - i = _i.value; + _ref = _i.value; } -} + var i = _ref; +} \ No newline at end of file