diff --git a/lib/6to5/transformation/transformers/es6-for-of.js b/lib/6to5/transformation/transformers/es6-for-of.js index f24987a2c1..b0ab43a191 100644 --- a/lib/6to5/transformation/transformers/es6-for-of.js +++ b/lib/6to5/transformation/transformers/es6-for-of.js @@ -5,9 +5,10 @@ exports.ForOfStatement = function (node, parent, file, scope) { var callback = spec; if (file.isFast("forOf")) callback = fast; - var build = callback(node, parent, file, scope); - var loop = build.loop; - var block = loop.body; + var build = callback(node, parent, file, scope); + var declar = build.declar; + var loop = build.loop; + var block = loop.body; // inherit comments from the original loop t.inheritsComments(loop, node); @@ -15,8 +16,14 @@ exports.ForOfStatement = function (node, parent, file, scope) { // ensure that it's a block so we can take all it's statemetns t.ensureBlock(node); - // push the value declaration to the new loop body - if (build.declar) block.body.push(build.declar); + // add the value declaration to the new loop body + if (declar){ + if (build.shouldUnshift) { + block.body.unshift(declar); + } else { + block.body.push(declar); + } + } // push the rest of the original loop body onto our new body block.body = block.body.concat(node.body.body); @@ -42,7 +49,7 @@ var fast = function (node, parent, file, scope) { } var loop = util.template("for-of-fast", { - LOOP_OBJECT: file.generateUidIdentifier("loopObject", scope), + LOOP_OBJECT: file.generateUidIdentifier("iterator", scope), IS_ARRAY: file.generateUidIdentifier("isArray", scope), OBJECT: node.right, INDEX: file.generateUidIdentifier("i", scope), @@ -50,8 +57,9 @@ var fast = function (node, parent, file, scope) { }); return { - declar: declar, - loop: loop + shouldUnshift: true, + declar: declar, + loop: loop }; }; diff --git a/test/fixtures/transformation/es6-for-of-fast/identifier/actual.js b/test/fixtures/transformation/es6-for-of-fast/identifier/actual.js new file mode 100644 index 0000000000..ddd15051ba --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/identifier/actual.js @@ -0,0 +1,3 @@ +for (i of arr) { + +} diff --git a/test/fixtures/transformation/es6-for-of-fast/identifier/expected.js b/test/fixtures/transformation/es6-for-of-fast/identifier/expected.js new file mode 100644 index 0000000000..4a7ea3a6a5 --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/identifier/expected.js @@ -0,0 +1,15 @@ +"use strict"; + +for (var _iterator = arr, + _isArray = Array.isArray(_iterator), + _i = 0, + _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + if (_isArray) { + if (_i >= _iterator.length) break; + i = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + i = _i.value; + } +} diff --git a/test/fixtures/transformation/es6-for-of-fast/let/actual.js b/test/fixtures/transformation/es6-for-of-fast/let/actual.js new file mode 100644 index 0000000000..f1e32392de --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/let/actual.js @@ -0,0 +1,3 @@ +for (let i of arr) { + +} diff --git a/test/fixtures/transformation/es6-for-of-fast/let/expected.js b/test/fixtures/transformation/es6-for-of-fast/let/expected.js new file mode 100644 index 0000000000..94848fe0c1 --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/let/expected.js @@ -0,0 +1,16 @@ +"use strict"; + +for (var _iterator = arr, + _isArray = Array.isArray(_iterator), + _i = 0, + _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var i = undefined; + if (_isArray) { + if (_i >= _iterator.length) break; + i = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + i = _i.value; + } +} diff --git a/test/fixtures/transformation/es6-for-of-fast/multiple/actual.js b/test/fixtures/transformation/es6-for-of-fast/multiple/actual.js new file mode 100644 index 0000000000..d9c969b809 --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/multiple/actual.js @@ -0,0 +1,7 @@ +for (var i of arr) { + +} + +for (var i of numbers) { + +} diff --git a/test/fixtures/transformation/es6-for-of-fast/multiple/expected.js b/test/fixtures/transformation/es6-for-of-fast/multiple/expected.js new file mode 100644 index 0000000000..a20dee268b --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/multiple/expected.js @@ -0,0 +1,31 @@ +"use strict"; + +for (var _iterator = arr, + _isArray = Array.isArray(_iterator), + _i = 0, + _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var i; + if (_isArray) { + if (_i >= _iterator.length) break; + i = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + i = _i.value; + } +} + +for (var _iterator2 = numbers, + _isArray2 = Array.isArray(_iterator2), + _i2 = 0, + _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var i; + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + i = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + i = _i2.value; + } +} diff --git a/test/fixtures/transformation/es6-for-of-fast/options.json b/test/fixtures/transformation/es6-for-of-fast/options.json new file mode 100644 index 0000000000..20a82b96e0 --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/options.json @@ -0,0 +1,3 @@ +{ + "fast": ["forOf"] +} diff --git a/test/fixtures/transformation/es6-for-of-fast/var/actual.js b/test/fixtures/transformation/es6-for-of-fast/var/actual.js new file mode 100644 index 0000000000..48e5f59b2c --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/var/actual.js @@ -0,0 +1,3 @@ +for (var i of arr) { + +} diff --git a/test/fixtures/transformation/es6-for-of-fast/var/expected.js b/test/fixtures/transformation/es6-for-of-fast/var/expected.js new file mode 100644 index 0000000000..3695bf3454 --- /dev/null +++ b/test/fixtures/transformation/es6-for-of-fast/var/expected.js @@ -0,0 +1,16 @@ +"use strict"; + +for (var _iterator = arr, + _isArray = Array.isArray(_iterator), + _i = 0, + _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var i; + if (_isArray) { + if (_i >= _iterator.length) break; + i = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + i = _i.value; + } +}