introduce awaits (#4495)

This commit is contained in:
Alex Lam S.L
2021-01-02 12:35:48 +00:00
committed by GitHub
parent b3a706114c
commit 15ef272790
3 changed files with 53 additions and 5 deletions

View File

@@ -51,6 +51,7 @@ function Compressor(options, false_by_default) {
arguments : !false_by_default, arguments : !false_by_default,
arrows : !false_by_default, arrows : !false_by_default,
assignments : !false_by_default, assignments : !false_by_default,
awaits : !false_by_default,
booleans : !false_by_default, booleans : !false_by_default,
collapse_vars : !false_by_default, collapse_vars : !false_by_default,
comparisons : !false_by_default, comparisons : !false_by_default,
@@ -6651,6 +6652,7 @@ merge(Compressor.prototype, {
}); });
def(AST_AsyncFunction, return_null); def(AST_AsyncFunction, return_null);
def(AST_Await, function(compressor) { def(AST_Await, function(compressor) {
if (!compressor.option("awaits")) return this;
var exp = this.expression.drop_side_effect_free(compressor); var exp = this.expression.drop_side_effect_free(compressor);
if (exp === this.expression) return this; if (exp === this.expression) return this;
var node = this.clone(); var node = this.clone();
@@ -6811,13 +6813,20 @@ merge(Compressor.prototype, {
var expressions = trim(this.expressions, compressor, first_in_statement); var expressions = trim(this.expressions, compressor, first_in_statement);
if (!expressions) return null; if (!expressions) return null;
var end = expressions.length - 1; 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; var assign, cond, lhs;
if (compressor.option("conditionals") if (compressor.option("conditionals")
&& end > 0 && end > 0
&& (assign = expressions[end - 1]) instanceof AST_Assign && (assign = expressions[end - 1]) instanceof AST_Assign
&& assign.operator == "=" && assign.operator == "="
&& (lhs = assign.left) instanceof AST_SymbolRef && (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 = assign.clone();
assign.right = cond; assign.right = cond;
expressions = expressions.slice(0, -2); expressions = expressions.slice(0, -2);
@@ -8033,7 +8042,8 @@ merge(Compressor.prototype, {
} }
} }
var fn = exp instanceof AST_SymbolRef ? exp.fixed_value() : exp; 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 stat = is_func && fn.first_statement();
var has_default = false; var has_default = false;
var can_drop = is_func && all(fn.argnames, function(argname, index) { var can_drop = is_func && all(fn.argnames, function(argname, index) {
@@ -8665,6 +8675,7 @@ merge(Compressor.prototype, {
}); });
OPT(AST_Await, function(self, compressor) { OPT(AST_Await, function(self, compressor) {
if (!compressor.option("awaits")) return self;
if (compressor.option("sequences")) { if (compressor.option("sequences")) {
var seq = lift_sequence_in_expression(self, compressor); var seq = lift_sequence_in_expression(self, compressor);
if (seq !== self) return seq.optimize(compressor); if (seq !== self) return seq.optimize(compressor);
@@ -8672,7 +8683,15 @@ merge(Compressor.prototype, {
if (compressor.option("side_effects")) { if (compressor.option("side_effects")) {
var exp = self.expression; var exp = self.expression;
if (exp instanceof AST_Await) return exp; 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; return self;
}); });

View File

@@ -142,6 +142,7 @@ dont_inline: {
inline_await_1: { inline_await_1: {
options = { options = {
awaits: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
unused: true, unused: true,
@@ -167,6 +168,7 @@ inline_await_1: {
inline_await_1_trim: { inline_await_1_trim: {
options = { options = {
awaits: true,
if_return: true, if_return: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
@@ -194,6 +196,7 @@ inline_await_1_trim: {
inline_await_2: { inline_await_2: {
options = { options = {
awaits: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
unused: true, unused: true,
@@ -219,6 +222,7 @@ inline_await_2: {
inline_await_2_trim: { inline_await_2_trim: {
options = { options = {
awaits: true,
if_return: true, if_return: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
@@ -246,6 +250,7 @@ inline_await_2_trim: {
inline_await_3: { inline_await_3: {
options = { options = {
awaits: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
unused: true, unused: true,
@@ -270,6 +275,7 @@ inline_await_3: {
inline_await_3_trim: { inline_await_3_trim: {
options = { options = {
awaits: true,
inline: true, inline: true,
reduce_vars: true, reduce_vars: true,
sequences: true, sequences: true,
@@ -296,6 +302,7 @@ inline_await_3_trim: {
await_unary: { await_unary: {
options = { options = {
awaits: true,
side_effects: true, side_effects: true,
} }
input: { input: {
@@ -320,6 +327,28 @@ await_unary: {
node_version: ">=8" 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: { evaluate: {
options = { options = {
evaluate: true, evaluate: true,

View File

@@ -3,11 +3,11 @@ var fs = require("fs");
exports.FILES = [ exports.FILES = [
require.resolve("../lib/utils.js"), require.resolve("../lib/utils.js"),
require.resolve("../lib/ast.js"), require.resolve("../lib/ast.js"),
require.resolve("../lib/parse.js"),
require.resolve("../lib/transform.js"), require.resolve("../lib/transform.js"),
require.resolve("../lib/parse.js"),
require.resolve("../lib/scope.js"), require.resolve("../lib/scope.js"),
require.resolve("../lib/output.js"),
require.resolve("../lib/compress.js"), require.resolve("../lib/compress.js"),
require.resolve("../lib/output.js"),
require.resolve("../lib/sourcemap.js"), require.resolve("../lib/sourcemap.js"),
require.resolve("../lib/mozilla-ast.js"), require.resolve("../lib/mozilla-ast.js"),
require.resolve("../lib/propmangle.js"), require.resolve("../lib/propmangle.js"),