enhance `collapse_vars` (#3799)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 18 Apr 2020 15:12:20 +0000 (16:12 +0100)
committerGitHub <noreply@github.com>
Sat, 18 Apr 2020 15:12:20 +0000 (23:12 +0800)
lib/compress.js
test/compress/collapse_vars.js

index 872e2bb..9504241 100644 (file)
@@ -1264,6 +1264,7 @@ merge(Compressor.prototype, {
                 if (stat_index == 0 && compressor.option("unused")) extract_args();
                 // Find collapsible assignments
                 var hit_stack = [];
+                var declare_only = Object.create(null);
                 extract_candidates(statements[stat_index]);
                 while (candidates.length > 0) {
                     hit_stack = candidates.pop();
@@ -1574,6 +1575,8 @@ merge(Compressor.prototype, {
                             candidates.push(hit_stack.slice());
                         }
                         extract_candidates(expr.value);
+                    } else {
+                        declare_only[expr.name.name] = (declare_only[expr.name.name] || 0) + 1;
                     }
                 }
                 hit_stack.pop();
@@ -1739,6 +1742,7 @@ merge(Compressor.prototype, {
                     if (!member(expr.name, def.orig)) return;
                     var referenced = def.references.length - def.replaced;
                     var declared = def.orig.length - def.eliminated;
+                    declared -= declare_only[def.name] || 0;
                     if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg)) {
                         mangleable_var(expr.value);
                         return make_node(AST_SymbolRef, expr.name, expr.name);
index 17d9c98..ac87d78 100644 (file)
@@ -2205,8 +2205,8 @@ var_defs: {
     }
     expect: {
         var f1 = function(x, y) {
-            var r = x + y, z = r * r - r, b = 7;
-            console.log(z + b);
+            var r = x + y, a = r * r - r, b = 7;
+            console.log(a + b);
         };
         f1("1", 0);
     }