introduce awaits (#4495)
This commit is contained in:
@@ -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;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
Reference in New Issue
Block a user