fix corner case in `collapse_vars` (#5200)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 27 Nov 2021 17:43:43 +0000 (17:43 +0000)
committerGitHub <noreply@github.com>
Sat, 27 Nov 2021 17:43:43 +0000 (01:43 +0800)
fixes #5199

lib/compress.js
test/compress/templates.js

index ed8b94f..f7232e9 100644 (file)
@@ -2921,7 +2921,29 @@ merge(Compressor.prototype, {
                     if (value) {
                         lvalues.add(node.name, is_modified(compressor, tw, node, value, 0));
                     } else if (node instanceof AST_Lambda) {
-                        if (!(tw.find_parent(AST_Call) || tw.find_parent(AST_Scope))) return true;
+                        for (var level = 0, parent, child = node; parent = tw.parent(level++); child = parent) {
+                            if (parent instanceof AST_Assign) {
+                                if (parent.left === child) break;
+                                if (parent.operator == "=") continue;
+                                if (lazy_op[parent.operator.slice(0, -1)]) continue;
+                                break;
+                            }
+                            if (parent instanceof AST_Binary) {
+                                if (lazy_op[parent.operator]) continue;
+                                break;
+                            }
+                            if (parent instanceof AST_Call) return;
+                            if (parent instanceof AST_Scope) return;
+                            if (parent instanceof AST_Sequence) {
+                                if (parent.tail_node() === child) continue;
+                                break;
+                            }
+                            if (parent instanceof AST_Template) {
+                                if (parent.tag) return;
+                                break;
+                            }
+                        }
+                        return true;
                     } else if (find_arguments && node instanceof AST_Sub) {
                         scope.each_argname(function(argname) {
                             if (!compressor.option("reduce_vars") || argname.definition().assignments) {
index f0b6ebe..a50470d 100644 (file)
@@ -743,3 +743,29 @@ issue_5145_2: {
     ]
     node_version: ">=4"
 }
+
+issue_5199: {
+    options = {
+        collapse_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = function() {
+            console.log(typeof b);
+        }``;
+        {
+            const b = a;
+        }
+    }
+    expect: {
+        var a = function() {
+            console.log(typeof b);
+        }``;
+        {
+            const b = a;
+        }
+    }
+    expect_stdout: "undefined"
+    node_version: ">=4"
+}