enhance `collapse_vars` (#4826)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 27 Mar 2021 14:14:37 +0000 (14:14 +0000)
committerGitHub <noreply@github.com>
Sat, 27 Mar 2021 14:14:37 +0000 (22:14 +0800)
lib/compress.js

index f3e40f7..6286741 100644 (file)
@@ -1826,6 +1826,18 @@ merge(Compressor.prototype, {
                     can_replace = replace;
                     return signal_abort(node);
                 }
+                // Scan but don't replace inside block scope with colliding variable
+                if (node instanceof AST_BlockScope
+                    && !(node instanceof AST_Scope)
+                    && !(node.variables && node.variables.all(function(def) {
+                        return !lvalues.has(def.name);
+                    }))) {
+                    var replace = can_replace;
+                    can_replace = false;
+                    if (!handle_custom_scan_order(node, scanner)) descend(node, scanner);
+                    can_replace = replace;
+                    return signal_abort(node);
+                }
                 return handle_custom_scan_order(node, scanner);
             }, signal_abort);
             var multi_replacer = new TreeTransformer(function(node) {
@@ -1964,13 +1976,6 @@ merge(Compressor.prototype, {
                 }
                 // Skip (non-executed) functions
                 if (node instanceof AST_Scope) return node;
-                // Stop upon collision with block-scoped variables
-                if (!(node.variables && node.variables.all(function(def) {
-                    return !lvalues.has(def.name);
-                }))) {
-                    abort = true;
-                    return node;
-                }
                 // Scan object only in a for-in/of statement
                 if (node instanceof AST_ForEnumeration) {
                     node.object = node.object.transform(tt);