diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-05-27 17:57:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-28 00:57:14 +0800 |
commit | ab42a90edb0316d7c5ed1a74b4a7f9167789ce4d (patch) | |
tree | f70949b4f6289feb86ec1a07a9384803c0bee34f | |
parent | 362abe0ffb54c20bfc5a2d2d60c3ca2fe5ecd76e (diff) | |
download | tracifyjs-ab42a90edb0316d7c5ed1a74b4a7f9167789ce4d.tar.gz tracifyjs-ab42a90edb0316d7c5ed1a74b4a7f9167789ce4d.zip |
enhance `awaits` (#4969)
-rw-r--r-- | lib/compress.js | 77 | ||||
-rw-r--r-- | test/compress/awaits.js | 6 |
2 files changed, 61 insertions, 22 deletions
diff --git a/lib/compress.js b/lib/compress.js index b89f4624..e04e0560 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -309,18 +309,14 @@ merge(Compressor.prototype, { var self = this; var tt = new TreeTransformer(function(node) { if (insert && node instanceof AST_SimpleStatement) { - return make_node(AST_Return, node, { - value: node.body - }); + return transform ? transform(node) : make_node(AST_Return, node, { value: node.body }); } if (!insert && node instanceof AST_Return) { return transform ? transform(node) : make_node(AST_SimpleStatement, node, { body: node.value || make_node(AST_UnaryPrefix, node, { operator: "void", - expression: make_node(AST_Number, node, { - value: 0 - }) - }) + expression: make_node(AST_Number, node, { value: 0 }), + }), }); } if (node instanceof AST_Lambda && node !== self) { @@ -7533,8 +7529,43 @@ merge(Compressor.prototype, { node.value = value.drop_side_effect_free(compressor); } }); + if (async && compressor.option("awaits")) { + exp.process_expression(true, function(node) { + var body = node.body; + if (body instanceof AST_Await) { + if (is_primitive(compressor, body.expression)) { + body = body.expression.drop_side_effect_free(compressor, true); + if (!body) return make_node(AST_EmptyStatement, node); + node.body = body; + } + } else if (body instanceof AST_Sequence) { + var tail = body.tail_node(); + if (tail instanceof AST_Await && is_primitive(compressor, tail.expression)) { + tail = tail.expression.drop_side_effect_free(compressor); + body.expressions.pop(); + if (tail) body.expressions.push(tail); + } + } + return node; + }); + if (all(exp.body, is_empty) && !(is_arrow(exp) && exp.value)) { + var ctor; + switch (exp.CTOR) { + case AST_AsyncArrow: + ctor = AST_Arrow; + break; + case AST_AsyncFunction: + ctor = AST_Function; + break; + case AST_AsyncGeneratorFunction: + ctor = AST_GeneratorFunction; + break; + } + return make_node(ctor, exp, exp); + } + } + return exp.clone(); } - return drop_body; } def(AST_Call, function(compressor, first_in_statement) { var self = this; @@ -7557,10 +7588,11 @@ merge(Compressor.prototype, { var opt = call.transform(compressor); if (opt !== call) return opt.drop_side_effect_free(compressor, first_in_statement); } - if (drop_returns(compressor, exp)) { + var dropped = drop_returns(compressor, exp); + if (dropped) { // always shallow clone to ensure stripping of negated IIFEs self = self.clone(); - self.expression = exp.clone(); + self.expression = dropped; // avoid extraneous traversal if (exp._squeezed) self.expression._squeezed = true; } @@ -7759,10 +7791,11 @@ merge(Compressor.prototype, { return make_sequence(self, expressions).drop_side_effect_free(compressor, first_in_statement); } var tag = self.tag; - if (drop_returns(compressor, tag)) { + var dropped = drop_returns(compressor, tag); + if (dropped) { // always shallow clone to signal internal changes self = self.clone(); - self.tag = tag.clone(); + self.tag = dropped; // avoid extraneous traversal if (tag._squeezed) self.tag._squeezed = true; } @@ -9817,15 +9850,23 @@ merge(Compressor.prototype, { } if (compressor.option("side_effects")) { var exp = self.expression; - if (exp instanceof AST_Await) return exp; + if (exp instanceof AST_Await) return exp.optimize(compressor); if (exp instanceof AST_UnaryPrefix) { - if (exp.expression instanceof AST_Await) return exp; + if (exp.expression instanceof AST_Await) return exp.optimize(compressor); if (exp.operator == "void") return make_node(AST_UnaryPrefix, self, { operator: "void", - expression: make_node(AST_Await, self, { - expression: exp.expression, - }), - }); + expression: make_node(AST_Await, self, { expression: exp.expression }), + }).optimize(compressor); + } + for (var level = 0, node = self, parent; parent = compressor.parent(level++); node = parent) { + if (is_arrow(parent)) { + if (parent.value === node) return exp.optimize(compressor); + } else if (parent instanceof AST_Return) { + return exp.optimize(compressor); + } else if (parent instanceof AST_Sequence) { + if (parent.tail_node() === node) continue; + } + break; } } return self; diff --git a/test/compress/awaits.js b/test/compress/awaits.js index 8882f1e7..f794e9cf 100644 --- a/test/compress/awaits.js +++ b/test/compress/awaits.js @@ -227,9 +227,7 @@ inline_await_1_trim: { console.log("PASS"); } expect: { - (async function() { - await 0; - })(); + void 0; console.log("PASS"); } expect_stdout: "PASS" @@ -334,7 +332,7 @@ inline_await_3_trim: { } expect: { (async function() { - return a = "PASS", b = console.log, await b(a); + return a = "PASS", b = console.log, b(a); var a, b; })(); } |