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),
|
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++];
|
||||||
|
|||||||
@ -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
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user