fix `AST_PropAccess` in `collapse_vars` (#2370)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 17 Oct 2017 10:33:03 +0000 (18:33 +0800)
committerGitHub <noreply@github.com>
Tue, 17 Oct 2017 10:33:03 +0000 (18:33 +0800)
fixes #2364

lib/compress.js
test/compress/collapse_vars.js

index 5e391ab..3909c65 100644 (file)
@@ -838,7 +838,9 @@ merge(Compressor.prototype, {
                         var sym;
                         if (node instanceof AST_Call
                             || node instanceof AST_Exit
-                            || node instanceof AST_PropAccess && node.has_side_effects(compressor)
+                            || node instanceof AST_PropAccess
+                                && (node.has_side_effects(compressor)
+                                    || get_symbol(node).name in lvalues)
                             || node instanceof AST_SymbolRef
                                && (lvalues[node.name]
                                    || side_effects && !references_in_scope(node.definition()))
index ec94e9f..baa18ea 100644 (file)
@@ -2601,7 +2601,7 @@ prop_side_effects_2: {
     ]
 }
 
-issue_2364: {
+issue_2365: {
     options = {
         collapse_vars: true,
         pure_getters: true,
@@ -2652,3 +2652,62 @@ issue_2364: {
         "1",
     ]
 }
+
+issue_2364_1: {
+    options = {
+        collapse_vars: true,
+        pure_getters: true,
+    }
+    input: {
+        function inc(obj) {
+            return obj.count++;
+        }
+        function foo() {
+            var first = arguments[0];
+            var result = inc(first);
+            return foo.amount = first.count, result;
+        }
+        var data = {
+            count: 0,
+        };
+        var answer = foo(data);
+        console.log(foo.amount, answer);
+    }
+    expect: {
+        function inc(obj) {
+            return obj.count++;
+        }
+        function foo() {
+            var first = arguments[0];
+            var result = inc(first);
+            return foo.amount = first.count, result;
+        }
+        var data = {
+            count: 0
+        };
+        var answer = foo(data);
+        console.log(foo.amount, answer);
+    }
+    expect_stdout: "1 0"
+}
+
+issue_2364_2: {
+    options = {
+        collapse_vars: true,
+        pure_getters: true,
+    }
+    input: {
+        function callValidate() {
+            var validate = compilation.validate;
+            var result = validate.apply(null, arguments);
+            return callValidate.errors = validate.errors, result;
+        }
+    }
+    expect: {
+        function callValidate() {
+            var validate = compilation.validate;
+            var result = validate.apply(null, arguments);
+            return callValidate.errors = validate.errors, result;
+        }
+    }
+}