From a938fe5e1f2a68d724c4a5a3ae6d44664df804c6 Mon Sep 17 00:00:00 2001 From: kzc Date: Thu, 29 Jun 2017 22:12:42 -0400 Subject: [PATCH] async arrow function IIFE fix (#2184) fixes #2183 --- lib/compress.js | 10 +++++----- lib/output.js | 2 +- test/compress/async.js | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 3c6dc427..eef43396 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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); diff --git a/lib/output.js b/lib/output.js index 25ce22ea..69ff89fd 100644 --- a/lib/output.js +++ b/lib/output.js @@ -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 { diff --git a/test/compress/async.js b/test/compress/async.js index 2c5d680c..1874e8c9 100644 --- a/test/compress/async.js +++ b/test/compress/async.js @@ -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()})();" +}