fix corner case in `comparisons` (#4820)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 24 Mar 2021 02:10:02 +0000 (02:10 +0000)
committerGitHub <noreply@github.com>
Wed, 24 Mar 2021 02:10:02 +0000 (10:10 +0800)
fixes #4819

lib/compress.js
test/compress/assignments.js

index 6db9518..cc67bb2 100644 (file)
@@ -3689,20 +3689,25 @@ merge(Compressor.prototype, {
     (function(def) {
         def(AST_Node, return_false);
         def(AST_Array, return_true);
-        def(AST_Assign, function(compressor) {
-            return this.operator != "=" || this.right.is_defined(compressor);
-        });
-        def(AST_Binary, function(compressor) {
-            switch (this.operator) {
+        function is_binary_defined(compressor, op, node) {
+            switch (op) {
               case "&&":
-                return this.left.is_defined(compressor) && this.right.is_defined(compressor);
+                return node.left.is_defined(compressor) && node.right.is_defined(compressor);
               case "||":
-                return this.left.is_truthy() || this.right.is_defined(compressor);
+                return node.left.is_truthy() || node.right.is_defined(compressor);
               case "??":
-                return this.left.is_defined(compressor) || this.right.is_defined(compressor);
+                return node.left.is_defined(compressor) || node.right.is_defined(compressor);
               default:
                 return true;
             }
+        }
+        def(AST_Assign, function(compressor) {
+            var op = this.operator;
+            if (op == "=") return this.right.is_defined(compressor);
+            return is_binary_defined(compressor, op.slice(0, -1), this);
+        });
+        def(AST_Binary, function(compressor) {
+            return is_binary_defined(compressor, this.operator, this);
         });
         def(AST_Conditional, function(compressor) {
             return this.consequent.is_defined(compressor) && this.alternative.is_defined(compressor);
index db56229..80538bd 100644 (file)
@@ -589,3 +589,17 @@ issue_4815_2: {
     expect_stdout: "PASS"
     node_version: ">=15"
 }
+
+issue_4819: {
+    options = {
+        comparisons: true,
+    }
+    input: {
+        console.log(void 0 === ([].p &&= 42));
+    }
+    expect: {
+        console.log(void 0 === ([].p &&= 42));
+    }
+    expect_stdout: "true"
+    node_version: ">=15"
+}