enhance rests (#4546)
This commit is contained in:
parent
b689028e87
commit
46ad273df4
|
|
@ -4871,8 +4871,18 @@ merge(Compressor.prototype, {
|
||||||
return trim_block(self);
|
return trim_block(self);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function drop_rest_farg(fn, compressor) {
|
||||||
|
if (!compressor.option("rests")) return;
|
||||||
|
if (fn.uses_arguments) return;
|
||||||
|
if (!(fn.rest instanceof AST_DestructuredArray)) return;
|
||||||
|
if (!compressor.drop_fargs(fn, compressor.parent())) return;
|
||||||
|
fn.argnames = fn.argnames.concat(fn.rest.elements);
|
||||||
|
fn.rest = null;
|
||||||
|
}
|
||||||
|
|
||||||
function opt_arrow(self, compressor) {
|
function opt_arrow(self, compressor) {
|
||||||
if (!compressor.option("arrows")) return self;
|
if (!compressor.option("arrows")) return self;
|
||||||
|
drop_rest_farg(self, compressor);
|
||||||
var body = tighten_body(self.value ? [ self.first_statement() ] : self.body, compressor);
|
var body = tighten_body(self.value ? [ self.first_statement() ] : self.body, compressor);
|
||||||
switch (body.length) {
|
switch (body.length) {
|
||||||
case 1:
|
case 1:
|
||||||
|
|
@ -4892,7 +4902,14 @@ merge(Compressor.prototype, {
|
||||||
OPT(AST_Arrow, opt_arrow);
|
OPT(AST_Arrow, opt_arrow);
|
||||||
OPT(AST_AsyncArrow, opt_arrow);
|
OPT(AST_AsyncArrow, opt_arrow);
|
||||||
|
|
||||||
|
OPT(AST_Defun, function(self, compressor) {
|
||||||
|
drop_rest_farg(self, compressor);
|
||||||
|
self.body = tighten_body(self.body, compressor);
|
||||||
|
return self;
|
||||||
|
});
|
||||||
|
|
||||||
OPT(AST_Function, function(self, compressor) {
|
OPT(AST_Function, function(self, compressor) {
|
||||||
|
drop_rest_farg(self, compressor);
|
||||||
self.body = tighten_body(self.body, compressor);
|
self.body = tighten_body(self.body, compressor);
|
||||||
if (compressor.option("inline")) for (var i = 0; i < self.body.length; i++) {
|
if (compressor.option("inline")) for (var i = 0; i < self.body.length; i++) {
|
||||||
var stat = self.body[i];
|
var stat = self.body[i];
|
||||||
|
|
@ -10686,6 +10703,14 @@ merge(Compressor.prototype, {
|
||||||
return try_evaluate(compressor, self);
|
return try_evaluate(compressor, self);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
OPT(AST_DestructuredArray, function(self, compressor) {
|
||||||
|
if (compressor.option("rests") && self.rest instanceof AST_DestructuredArray) {
|
||||||
|
self.elements = self.elements.concat(self.rest.elements);
|
||||||
|
self.rest = null;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
});
|
||||||
|
|
||||||
OPT(AST_DestructuredKeyVal, function(self, compressor) {
|
OPT(AST_DestructuredKeyVal, function(self, compressor) {
|
||||||
if (compressor.option("objects")) {
|
if (compressor.option("objects")) {
|
||||||
var key = self.key;
|
var key = self.key;
|
||||||
|
|
|
||||||
|
|
@ -486,6 +486,62 @@ keep_arguments: {
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_rest_array: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...[ a ]] = [ "PASS" ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ a ] = [ "PASS" ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_rest_arrow: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(((...[ a ]) => a)("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a => a)("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_rest_lambda: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4525_1: {
|
issue_4525_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user