add improved for-of loose behaviour that supports destructuring - fixes #615
This commit is contained in:
parent
c25c33e3ee
commit
960a70287d
@ -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++];
|
||||
|
||||
@ -20,12 +20,8 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
// push the rest of the original loop body onto our new body
|
||||
block.body = block.body.concat(node.body.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,8 +57,13 @@ 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
|
||||
};
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user