diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-01-02 12:35:48 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-02 20:35:48 +0800 |
commit | 15ef2727903a00534efbfe5f416340fd73979767 (patch) | |
tree | 0ad7de9c29842f37a95745f20608f744e94265bf | |
parent | b3a706114ce775f75c4a6da37bff4a8ef32415d5 (diff) | |
download | tracifyjs-15ef2727903a00534efbfe5f416340fd73979767.tar.gz tracifyjs-15ef2727903a00534efbfe5f416340fd73979767.zip |
introduce `awaits` (#4495)
-rw-r--r-- | lib/compress.js | 25 | ||||
-rw-r--r-- | test/compress/async.js | 29 | ||||
-rw-r--r-- | tools/node.js | 4 |
3 files changed, 53 insertions, 5 deletions
diff --git a/lib/compress.js b/lib/compress.js index 0ab65868..d5c22063 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -51,6 +51,7 @@ function Compressor(options, false_by_default) { arguments : !false_by_default, arrows : !false_by_default, assignments : !false_by_default, + awaits : !false_by_default, booleans : !false_by_default, collapse_vars : !false_by_default, comparisons : !false_by_default, @@ -6651,6 +6652,7 @@ merge(Compressor.prototype, { }); def(AST_AsyncFunction, return_null); def(AST_Await, function(compressor) { + if (!compressor.option("awaits")) return this; var exp = this.expression.drop_side_effect_free(compressor); if (exp === this.expression) return this; var node = this.clone(); @@ -6811,13 +6813,20 @@ merge(Compressor.prototype, { var expressions = trim(this.expressions, compressor, first_in_statement); if (!expressions) return null; var end = expressions.length - 1; + var last = expressions[end]; + if (compressor.option("awaits") && end > 0 && last instanceof AST_Await && last.expression.is_constant()) { + expressions = expressions.slice(0, -1); + end--; + last.expression = expressions[end]; + expressions[end] = last; + } var assign, cond, lhs; if (compressor.option("conditionals") && end > 0 && (assign = expressions[end - 1]) instanceof AST_Assign && assign.operator == "=" && (lhs = assign.left) instanceof AST_SymbolRef - && (cond = to_conditional_assignment(compressor, lhs.definition(), assign.right, expressions[end]))) { + && (cond = to_conditional_assignment(compressor, lhs.definition(), assign.right, last))) { assign = assign.clone(); assign.right = cond; expressions = expressions.slice(0, -2); @@ -8033,7 +8042,8 @@ merge(Compressor.prototype, { } } var fn = exp instanceof AST_SymbolRef ? exp.fixed_value() : exp; - var is_func = fn instanceof AST_Lambda && (!is_async(fn) || compressor.parent() instanceof AST_Await); + var is_func = fn instanceof AST_Lambda && (!is_async(fn) + || compressor.option("awaits") && compressor.parent() instanceof AST_Await); var stat = is_func && fn.first_statement(); var has_default = false; var can_drop = is_func && all(fn.argnames, function(argname, index) { @@ -8665,6 +8675,7 @@ merge(Compressor.prototype, { }); OPT(AST_Await, function(self, compressor) { + if (!compressor.option("awaits")) return self; if (compressor.option("sequences")) { var seq = lift_sequence_in_expression(self, compressor); if (seq !== self) return seq.optimize(compressor); @@ -8672,7 +8683,15 @@ merge(Compressor.prototype, { if (compressor.option("side_effects")) { var exp = self.expression; if (exp instanceof AST_Await) return exp; - if (exp instanceof AST_UnaryPrefix && exp.expression instanceof AST_Await) return exp; + if (exp instanceof AST_UnaryPrefix) { + if (exp.expression instanceof AST_Await) return exp; + if (exp.operator == "void") return make_node(AST_UnaryPrefix, self, { + operator: "void", + expression: make_node(AST_Await, self, { + expression: exp.expression, + }), + }); + } } return self; }); diff --git a/test/compress/async.js b/test/compress/async.js index 4039dbb1..7ae753fb 100644 --- a/test/compress/async.js +++ b/test/compress/async.js @@ -142,6 +142,7 @@ dont_inline: { inline_await_1: { options = { + awaits: true, inline: true, reduce_vars: true, unused: true, @@ -167,6 +168,7 @@ inline_await_1: { inline_await_1_trim: { options = { + awaits: true, if_return: true, inline: true, reduce_vars: true, @@ -194,6 +196,7 @@ inline_await_1_trim: { inline_await_2: { options = { + awaits: true, inline: true, reduce_vars: true, unused: true, @@ -219,6 +222,7 @@ inline_await_2: { inline_await_2_trim: { options = { + awaits: true, if_return: true, inline: true, reduce_vars: true, @@ -246,6 +250,7 @@ inline_await_2_trim: { inline_await_3: { options = { + awaits: true, inline: true, reduce_vars: true, unused: true, @@ -270,6 +275,7 @@ inline_await_3: { inline_await_3_trim: { options = { + awaits: true, inline: true, reduce_vars: true, sequences: true, @@ -296,6 +302,7 @@ inline_await_3_trim: { await_unary: { options = { + awaits: true, side_effects: true, } input: { @@ -320,6 +327,28 @@ await_unary: { node_version: ">=8" } +await_void: { + options = { + awaits: true, + if_return: true, + sequences: true, + side_effects: true, + } + input: { + (async function() { + console.log("PASS"); + return await void 42; + })(); + } + expect: { + (async function() { + await console.log("PASS"); + })(); + } + expect_stdout: "PASS" + node_version: ">=8" +} + evaluate: { options = { evaluate: true, diff --git a/tools/node.js b/tools/node.js index 631a2930..1ebc7730 100644 --- a/tools/node.js +++ b/tools/node.js @@ -3,11 +3,11 @@ var fs = require("fs"); exports.FILES = [ require.resolve("../lib/utils.js"), require.resolve("../lib/ast.js"), - require.resolve("../lib/parse.js"), require.resolve("../lib/transform.js"), + require.resolve("../lib/parse.js"), require.resolve("../lib/scope.js"), - require.resolve("../lib/output.js"), require.resolve("../lib/compress.js"), + require.resolve("../lib/output.js"), require.resolve("../lib/sourcemap.js"), require.resolve("../lib/mozilla-ast.js"), require.resolve("../lib/propmangle.js"), |