add improved for-of loose behaviour that supports destructuring - fixes #615

This commit is contained in:
Sebastian McKenzie 2015-01-29 00:50:22 +11:00
parent c25c33e3ee
commit 960a70287d
5 changed files with 31 additions and 25 deletions

View File

@ -2,6 +2,7 @@ for (var LOOP_OBJECT = OBJECT,
IS_ARRAY = Array.isArray(LOOP_OBJECT), IS_ARRAY = Array.isArray(LOOP_OBJECT),
INDEX = 0, INDEX = 0,
LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) { LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {
var ID;
if (IS_ARRAY) { if (IS_ARRAY) {
if (INDEX >= LOOP_OBJECT.length) break; if (INDEX >= LOOP_OBJECT.length) break;
ID = LOOP_OBJECT[INDEX++]; ID = LOOP_OBJECT[INDEX++];

View File

@ -20,11 +20,7 @@ exports.ForOfStatement = function (node, parent, scope, context, file) {
// add the value declaration to the new loop body // add the value declaration to the new loop body
if (declar) { if (declar) {
if (build.shouldUnshift) { block.body.push(declar);
block.body.unshift(declar);
} else {
block.body.push(declar);
}
} }
// push the rest of the original loop body onto our new body // 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; id = left;
} else if (t.isVariableDeclaration(left)) { } else if (t.isVariableDeclaration(left)) {
// for (var i of test) // for (var i of test)
id = left.declarations[0].id; id = scope.generateUidIdentifier("ref");
declar = t.variableDeclaration(left.kind, [ declar = t.variableDeclaration(left.kind, [
t.variableDeclarator(id) t.variableDeclarator(left.declarations[0].id, id)
]); ]);
} else { } else {
throw file.errorWithNode(left, "Unknown node type " + left.type + " in ForOfStatement"); 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 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 { return {
shouldUnshift: true, declar: declar,
declar: declar, loop: loop
loop: loop
}; };
}; };

View File

@ -1,13 +1,14 @@
"use strict"; "use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i = undefined; var _ref;
if (_isArray) { if (_isArray) {
if (_i >= _iterator.length) break; if (_i >= _iterator.length) break;
i = _iterator[_i++]; _ref = _iterator[_i++];
} else { } else {
_i = _iterator.next(); _i = _iterator.next();
if (_i.done) break; if (_i.done) break;
i = _i.value; _ref = _i.value;
} }
} var i = _ref;
}

View File

@ -1,25 +1,27 @@
"use strict"; "use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i; var _ref;
if (_isArray) { if (_isArray) {
if (_i >= _iterator.length) break; if (_i >= _iterator.length) break;
i = _iterator[_i++]; _ref = _iterator[_i++];
} else { } else {
_i = _iterator.next(); _i = _iterator.next();
if (_i.done) break; 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]();;) { for (var _iterator2 = numbers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var i; var _ref2;
if (_isArray2) { if (_isArray2) {
if (_i2 >= _iterator2.length) break; if (_i2 >= _iterator2.length) break;
i = _iterator2[_i2++]; _ref2 = _iterator2[_i2++];
} else { } else {
_i2 = _iterator2.next(); _i2 = _iterator2.next();
if (_i2.done) break; if (_i2.done) break;
i = _i2.value; _ref2 = _i2.value;
} }
} var i = _ref2;
}

View File

@ -1,13 +1,14 @@
"use strict"; "use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i; var _ref;
if (_isArray) { if (_isArray) {
if (_i >= _iterator.length) break; if (_i >= _iterator.length) break;
i = _iterator[_i++]; _ref = _iterator[_i++];
} else { } else {
_i = _iterator.next(); _i = _iterator.next();
if (_i.done) break; if (_i.done) break;
i = _i.value; _ref = _i.value;
} }
} var i = _ref;
}