From 149a569ac8e17b3e614a59b6ed70f2d4bffd429b Mon Sep 17 00:00:00 2001 From: kzc Date: Mon, 5 Feb 2018 02:01:31 -0500 Subject: [PATCH] fix `inline` within arrow functions (#2881) fixes #2874 --- lib/compress.js | 3 + test/compress/functions.js | 8 ++- test/compress/harmony.js | 131 +++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 3 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 3c680401..5bfa9099 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4592,6 +4592,9 @@ merge(Compressor.prototype, { && !fn.uses_arguments && !fn.uses_eval && !(fn.name && fn instanceof AST_Function) + && (!(compressor.find_parent(AST_Lambda) instanceof AST_Arrow) + || fn.argnames.length == 0 + && (fn.body instanceof AST_Node || fn.body.length == 1)) && (value = can_flatten_body(stat)) && (exp === fn || compressor.option("unused") diff --git a/test/compress/functions.js b/test/compress/functions.js index ac1387a6..c19e5812 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -1516,9 +1516,11 @@ issue_2647_2: { } expect: { (function() { - console.log((() => (x = "pass", x.toUpperCase()))()); - var x; - })(); + function foo(x) { + return x.toUpperCase(); + } + console.log((() => foo("pass"))()); + }()); } expect_stdout: "PASS" node_version: ">=4" diff --git a/test/compress/harmony.js b/test/compress/harmony.js index ae85a337..b85214ec 100644 --- a/test/compress/harmony.js +++ b/test/compress/harmony.js @@ -1470,3 +1470,134 @@ inline_arrow_using_arguments: { ] node_version: ">=6" } + +issue_2874_1: { + options = { + collapse_vars: true, + evaluate: true, + inline: 3, + reduce_funcs: true, + reduce_vars: true, + sequences: true, + side_effects: true, + unused: true, + } + input: { + (function() { + function foo() { + let letters = ["A", "B", "C"]; + let result = [2, 1, 0].map(key => bar(letters[key] + key)); + return result; + } + function bar(value) { + return () => console.log(value); + } + foo().map(fn => fn()); + })(); + } + expect: { + (function() { + (function() { + let letters = [ "A", "B", "C" ]; + return [ 2, 1, 0 ].map(key => (function(value) { + return () => console.log(value); + })(letters[key] + key)); + })().map(fn => fn()); + })(); + } + expect_stdout: [ + "C2", + "B1", + "A0", + ] + node_version: ">=6" +} + +issue_2874_2: { + options = { + collapse_vars: true, + evaluate: true, + inline: 3, + reduce_funcs: true, + reduce_vars: true, + sequences: true, + side_effects: true, + unused: true, + } + input: { + (function() { + let keys = []; + function foo() { + var result = [2, 1, 0].map(value => { + keys.push(value); + return bar(); + }); + return result; + } + function bar() { + var letters = ["A", "B", "C"], key = keys.shift(); + return () => console.log(letters[key] + key); + } + foo().map(fn => fn()); + })(); + } + expect: { + (function() { + let keys = []; + [ 2, 1, 0 ].map(value => { + return keys.push(value), function() { + var letters = [ "A", "B", "C" ], key = keys.shift(); + return () => console.log(letters[key] + key); + }(); + }).map(fn => fn()); + })(); + } + expect_stdout: [ + "C2", + "B1", + "A0", + ] + node_version: ">=6" +} + +issue_2874_3: { + options = { + collapse_vars: true, + evaluate: true, + inline: 3, + reduce_funcs: false, + reduce_vars: true, + sequences: true, + side_effects: true, + toplevel: true, + unused: true, + } + input: { + function f() { + return x + y; + } + let x, y; + let a = (z) => { + x = "A"; + y = z; + console.log(f()); + } + a(1); + a(2); + } + expect: { + let x, y; + let a = z => { + x = "A", + y = z, + console.log(x + y); + }; + a(1), + a(2); + } + expect_stdout: [ + "A1", + "A2", + ] + node_version: ">=6" +}