fix corner case in `spread` (#4370)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 11 Dec 2020 22:45:59 +0000 (22:45 +0000)
committerGitHub <noreply@github.com>
Fri, 11 Dec 2020 22:45:59 +0000 (06:45 +0800)
lib/compress.js
test/compress/spread.js

index cc601bf..9658968 100644 (file)
@@ -10051,13 +10051,14 @@ merge(Compressor.prototype, {
             found = true;
             var exp = prop.expression;
             if (compressor.option("spread") && exp instanceof AST_Object && all(exp.properties, function(prop) {
-                return !(prop instanceof AST_ObjectGetter
-                    || prop instanceof AST_ObjectSetter && prop.key instanceof AST_Node
-                    || prop instanceof AST_Spread);
+                return !(prop instanceof AST_ObjectGetter || prop instanceof AST_Spread);
             })) {
                 changed = true;
                 exp.properties.forEach(function(prop) {
-                    if (prop instanceof AST_ObjectKeyVal) process(prop);
+                    process(prop instanceof AST_ObjectSetter ? make_node(AST_ObjectKeyVal, prop, {
+                        key: prop.key,
+                        value: make_node(AST_Undefined, prop).optimize(compressor)
+                    }) : prop);
                 });
             } else {
                 generated = true;
index 7834875..4171551 100644 (file)
@@ -250,6 +250,31 @@ reduce_vars_2: {
     node_version: ">=6"
 }
 
+convert_setter: {
+    options = {
+        objects: true,
+        spread: true,
+    }
+    input: {
+        var o = {
+            ...{
+                set PASS(v) {},
+            },
+        };
+        for (var k in o)
+            console.log(k, o[k]);
+    }
+    expect: {
+        var o = {
+            PASS: void 0,
+        };
+        for (var k in o)
+            console.log(k, o[k]);
+    }
+    expect_stdout: "PASS undefined"
+    node_version: ">=8"
+}
+
 keep_getter_1: {
     options = {
         side_effects: true,
@@ -773,9 +798,7 @@ issue_4363: {
     }
     expect: {
         ({
-            ...{
-                set [console.log("PASS")](v) {},
-            },
+            [console.log("PASS")]: void 0,
         });
     }
     expect_stdout: "PASS"