async arrow function IIFE fix (#2184)

fixes #2183
This commit is contained in:
kzc
2017-06-29 22:12:42 -04:00
committed by Alex Lam S.L
parent 07a5a57336
commit a938fe5e1f
3 changed files with 30 additions and 6 deletions

View File

@@ -561,8 +561,8 @@ merge(Compressor.prototype, {
return orig.length == 1 && orig[0] instanceof AST_SymbolLambda;
});
function is_func_expr(node) {
return node instanceof AST_Arrow || node instanceof AST_Function;
function is_func_expr(node, traditional) {
return node instanceof AST_Function || !traditional && node instanceof AST_Arrow;
}
function is_lhs_read_only(lhs) {
@@ -706,9 +706,9 @@ merge(Compressor.prototype, {
return x;
};
function is_iife_call(node) {
function is_iife_call(node, traditional) {
if (node instanceof AST_Call && !(node instanceof AST_New)) {
return is_func_expr(node.expression) || is_iife_call(node.expression);
return is_func_expr(node.expression, traditional) || is_iife_call(node.expression);
}
return false;
}
@@ -3452,7 +3452,7 @@ merge(Compressor.prototype, {
}
if (compressor.option("negate_iife")
&& compressor.parent() instanceof AST_SimpleStatement
&& is_iife_call(self)) {
&& is_iife_call(self, true)) {
return self.negate(compressor, true);
}
var ev = self.evaluate(compressor);

View File

@@ -1045,11 +1045,11 @@ function OutputStream(options) {
var needs_parens = parent instanceof AST_Binary ||
parent instanceof AST_Unary ||
(parent instanceof AST_Call && self === parent.expression);
if (needs_parens) { output.print("(") }
if (self.async) {
output.print("async");
output.space();
}
if (needs_parens) { output.print("(") }
if (self.argnames.length === 1 && self.argnames[0] instanceof AST_Symbol) {
self.argnames[0].print(output);
} else {

View File

@@ -268,3 +268,27 @@ async_arrow_wait: {
}
expect_exact: "var a=async(x,y)=>await x(y);"
}
async_arrow_iife: {
input: {
(async () => {
await fetch({});
})();
}
expect_exact: "(async()=>{await fetch({})})();"
}
async_arrow_iife_negate_iife: {
options = {
negate_iife: true,
}
input: {
(async () => {
await fetch();
})();
(() => {
plain();
})();
}
expect_exact: "(async()=>{await fetch()})();(()=>{plain()})();"
}