From ca6dce43feb9d92cb5004c6ee4d5b2e0b4336d93 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sun, 20 Oct 2019 03:53:20 +0800 Subject: [PATCH] fix corner case in `collapse_vars` (#3501) --- lib/compress.js | 48 +++++++--------------------------- test/compress/collapse_vars.js | 21 +++++++++++++++ 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 0888c107..8ef94e43 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1465,50 +1465,20 @@ merge(Compressor.prototype, { hit_stack.pop(); } - function find_stop(node, level, write_only) { + function find_stop(node, level) { var parent = scanner.parent(level); - if (parent instanceof AST_Assign) { - if (write_only - && !(parent.left instanceof AST_PropAccess - || parent.left.name in lvalues)) { - return find_stop(parent, level + 1, write_only); - } - return node; - } - if (parent instanceof AST_Binary) { - if (write_only && (!lazy_op[parent.operator] || parent.left === node)) { - return find_stop(parent, level + 1, write_only); - } - return node; - } + if (parent instanceof AST_Assign) return node; + if (parent instanceof AST_Binary) return node; if (parent instanceof AST_Call) return node; if (parent instanceof AST_Case) return node; - if (parent instanceof AST_Conditional) { - if (write_only && parent.condition === node) { - return find_stop(parent, level + 1, write_only); - } - return node; - } - if (parent instanceof AST_Definitions) { - return find_stop(parent, level + 1, true); - } - if (parent instanceof AST_Exit) { - return write_only ? find_stop(parent, level + 1, write_only) : node; - } - if (parent instanceof AST_If) { - if (write_only && parent.condition === node) { - return find_stop(parent, level + 1, write_only); - } - return node; - } + if (parent instanceof AST_Conditional) return node; + if (parent instanceof AST_Definitions) return find_stop(parent, level + 1); + if (parent instanceof AST_Exit) return node; + if (parent instanceof AST_If) return node; if (parent instanceof AST_IterationStatement) return node; if (parent instanceof AST_PropAccess) return node; - if (parent instanceof AST_Sequence) { - return find_stop(parent, level + 1, parent.tail_node() !== node); - } - if (parent instanceof AST_SimpleStatement) { - return find_stop(parent, level + 1, true); - } + if (parent instanceof AST_Sequence) return find_stop(parent, level + 1); + if (parent instanceof AST_SimpleStatement) return find_stop(parent, level + 1); if (parent instanceof AST_Switch) return node; if (parent instanceof AST_Unary) return node; if (parent instanceof AST_VarDef) return node; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 2381333a..951d72d6 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -6237,3 +6237,24 @@ issue_3439_2: { } expect_stdout: "number" } + +cond_sequence_return: { + options = { + collapse_vars: true, + } + input: { + console.log(function(n) { + var c = 0; + for (var k in [0, 1]) + if (c++, k == n) return c; + }(1)); + } + expect: { + console.log(function(n) { + var c = 0; + for (var k in [0, 1]) + if (c++, k == n) return c; + }(1)); + } + expect_stdout: "2" +} -- 2.34.1