unpack array rest elements when given a right hand array expression
This commit is contained in:
parent
62556f6102
commit
299e462a29
@ -163,13 +163,16 @@ var hasRest = function (pattern) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
DestructuringTransformer.prototype.canUnpackArrayPattern = function (pattern, arr) {
|
DestructuringTransformer.prototype.canUnpackArrayPattern = function (pattern, arr) {
|
||||||
|
// not an array so there's no way we can deal with this
|
||||||
if (!t.isArrayExpression(arr)) return false;
|
if (!t.isArrayExpression(arr)) return false;
|
||||||
if (pattern.elements.length < arr.elements.length) return false;
|
|
||||||
|
|
||||||
|
// pattern has less elements than the array and doesn't have a rest so some
|
||||||
|
// elements wont be evaluated
|
||||||
|
if (pattern.elements.length < arr.elements.length && !hasRest(pattern)) return false;
|
||||||
|
|
||||||
|
// deopt on holes
|
||||||
for (var i = 0; i < pattern.elements.length; i++) {
|
for (var i = 0; i < pattern.elements.length; i++) {
|
||||||
var elem = pattern.elements[i];
|
if (!pattern.elements[i]) return false;
|
||||||
if (!elem) return false; // hole
|
|
||||||
if (t.isRestElement(elem)) return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -177,7 +180,12 @@ DestructuringTransformer.prototype.canUnpackArrayPattern = function (pattern, ar
|
|||||||
|
|
||||||
DestructuringTransformer.prototype.pushUnpackedArrayPattern = function (pattern, arr) {
|
DestructuringTransformer.prototype.pushUnpackedArrayPattern = function (pattern, arr) {
|
||||||
for (var i = 0; i < pattern.elements.length; i++) {
|
for (var i = 0; i < pattern.elements.length; i++) {
|
||||||
this.push(pattern.elements[i], arr.elements[i]);
|
var elem = pattern.elements[i]
|
||||||
|
if (t.isRestElement(elem)) {
|
||||||
|
this.push(elem.argument, t.arrayExpression(arr.elements.slice(i)));
|
||||||
|
} else {
|
||||||
|
this.push(elem, arr.elements[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
// opt
|
// opt
|
||||||
var [a, b] = [1, 2];
|
var [a, b] = [1, 2];
|
||||||
var [[a, b]] = [[1, 2]];
|
var [[a, b]] = [[1, 2]];
|
||||||
|
var [a, b, ...c] = [1, 2, 3, 4];
|
||||||
|
var [[a, b, ...c]] = [[1, 2, 3, 4]];
|
||||||
|
|
||||||
// deopt
|
// deopt
|
||||||
var [a, b] = [1, 2, 3];
|
var [a, b] = [1, 2, 3];
|
||||||
var [[a, b]] = [[1, 2, 3]];
|
var [[a, b]] = [[1, 2, 3]];
|
||||||
var [a, b, ...items] = [1, 2, 3];
|
|
||||||
var [[a, b, ...items]] = [[1, 2, 3]];
|
|
||||||
|
|||||||
@ -5,6 +5,12 @@ var a = 1;
|
|||||||
var b = 2;
|
var b = 2;
|
||||||
var a = 1;
|
var a = 1;
|
||||||
var b = 2;
|
var b = 2;
|
||||||
|
var a = 1;
|
||||||
|
var b = 2;
|
||||||
|
var c = [3, 4];
|
||||||
|
var a = 1;
|
||||||
|
var b = 2;
|
||||||
|
var c = [3, 4];
|
||||||
|
|
||||||
// deopt
|
// deopt
|
||||||
var _ref = [1, 2, 3];
|
var _ref = [1, 2, 3];
|
||||||
@ -13,14 +19,3 @@ var b = _ref[1];
|
|||||||
var _ref2 = [1, 2, 3];
|
var _ref2 = [1, 2, 3];
|
||||||
var a = _ref2[0];
|
var a = _ref2[0];
|
||||||
var b = _ref2[1];
|
var b = _ref2[1];
|
||||||
var _ref3 = [1, 2, 3];
|
|
||||||
var a = _ref3[0];
|
|
||||||
var b = _ref3[1];
|
|
||||||
|
|
||||||
var items = _ref3.slice(2);
|
|
||||||
|
|
||||||
var _ref4 = [1, 2, 3];
|
|
||||||
var a = _ref4[0];
|
|
||||||
var b = _ref4[1];
|
|
||||||
|
|
||||||
var items = _ref4.slice(2);
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user