fix properties for array literal with spread

This commit is contained in:
kzc 2017-11-22 18:35:09 -05:00
parent 567cb0e4e3
commit b6868a030a
2 changed files with 94 additions and 3 deletions

View File

@ -4996,21 +4996,26 @@ merge(Compressor.prototype, {
&& prop instanceof AST_Number && expr instanceof AST_Array) { && prop instanceof AST_Number && expr instanceof AST_Array) {
var index = prop.getValue(); var index = prop.getValue();
var elements = expr.elements; var elements = expr.elements;
if (index in elements) { FLATTEN: if (index in elements) {
var flatten = true; var flatten = true;
var values = []; var values = [];
for (var i = elements.length; --i > index;) { for (var i = elements.length; --i > index;) {
var value = elements[i].drop_side_effect_free(compressor); var value = elements[i];
if (value instanceof AST_Expansion) break FLATTEN;
var value = value.drop_side_effect_free(compressor);
if (value) { if (value) {
values.unshift(value); values.unshift(value);
if (flatten && value.has_side_effects(compressor)) flatten = false; if (flatten && value.has_side_effects(compressor)) flatten = false;
} }
} }
var retValue = elements[index]; var retValue = elements[index];
if (retValue instanceof AST_Expansion) break FLATTEN;
retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue; retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue;
if (!flatten) values.unshift(retValue); if (!flatten) values.unshift(retValue);
while (--i >= 0) { while (--i >= 0) {
var value = elements[i].drop_side_effect_free(compressor); var value = elements[i];
if (value instanceof AST_Expansion) break FLATTEN;
value = value.drop_side_effect_free(compressor);
if (value) values.unshift(value); if (value) values.unshift(value);
else index--; else index--;
} }

View File

@ -975,3 +975,89 @@ shorthand_keywords: {
expect_stdout: true expect_stdout: true
node_version: ">=4" node_version: ">=4"
} }
array_literal_with_spread: {
options = {
properties: true,
side_effects: true,
}
input: {
var f = (x) => [...x][0];
console.log(f(["PASS"]));
console.log([10, ...[], 20, ...[30, 40], 50]["length"]);
console.log([10, ...[], 20, ...[30, 40], 50][0]);
console.log([10, ...[], 20, ...[30, 40], 50][1]);
console.log([10, ...[], 20, ...[30, 40], 50][2]);
console.log([10, ...[], 20, ...[30, 40], 50][3]);
console.log([10, ...[], 20, ...[30, 40], 50][4]);
console.log([10, ...[], 20, ...[30, 40], 50][5]);
console.log([10, 20][0]);
console.log([10, 20][1]);
console.log([10, 20][2]);
console.log([...[], 10, 20][0]);
console.log([...[], 10, 20][1]);
console.log([...[], 10, 20][2]);
console.log([10, ...[], 20][0]);
console.log([10, ...[], 20][1]);
console.log([10, ...[], 20][2]);
console.log([10, 20, ...[]][0]);
console.log([10, 20, ...[]][1]);
console.log([10, 20, ...[]][2]);
}
expect: {
var f = x => [ ...x ][0];
console.log(f([ "PASS" ]));
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ]["length"]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][0]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][1]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][2]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][3]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][4]);
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][5]);
console.log(10);
console.log(20);
console.log([ 10, 20 ][2]);
console.log([...[], 10, 20][0]);
console.log([...[], 10, 20][1]);
console.log([...[], 10, 20][2]);
console.log([10, ...[], 20][0]);
console.log([10, ...[], 20][1]);
console.log([10, ...[], 20][2]);
console.log([10, 20, ...[]][0]);
console.log([10, 20, ...[]][1]);
console.log([10, 20, ...[]][2]);
}
expect_stdout: [
"PASS",
"5",
"10",
"20",
"30",
"40",
"50",
"undefined",
"10",
"20",
"undefined",
"10",
"20",
"undefined",
"10",
"20",
"undefined",
"10",
"20",
"undefined",
]
node_version: ">=6"
}