fix corner case in `properties` (#4830)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 31 Mar 2021 23:05:50 +0000 (00:05 +0100)
committerGitHub <noreply@github.com>
Wed, 31 Mar 2021 23:05:50 +0000 (07:05 +0800)
fixes #4829

lib/compress.js
test/compress/classes.js

index 24446b2..5aeb910 100644 (file)
@@ -11457,15 +11457,15 @@ merge(Compressor.prototype, {
                 if (prop.key != key) continue;
                 if (!all(props, can_hoist_property)) break;
                 if (!safe_to_flatten(prop.value, compressor)) break;
+                props = props.map(function(prop) {
+                    return prop.value;
+                });
+                if (prop instanceof AST_ObjectMethod && prop.value instanceof AST_Function) {
+                    props[i] = make_node(AST_Arrow, prop.value, prop.value);
+                }
                 return make_node(AST_Sub, this, {
-                    expression: make_node(AST_Array, expr, {
-                        elements: props.map(function(prop) {
-                            return prop.value;
-                        })
-                    }),
-                    property: make_node(AST_Number, this, {
-                        value: i
-                    })
+                    expression: make_node(AST_Array, expr, { elements: props }),
+                    property: make_node(AST_Number, this, { value: i }),
                 });
             }
         }
index a940e70..b428e0e 100644 (file)
@@ -1344,3 +1344,27 @@ issue_4821_2: {
     expect_stdout: "function"
     node_version: ">=12"
 }
+
+issue_4829: {
+    options = {
+        properties: true,
+    }
+    input: {
+        "use strict";
+        try {
+            class A extends { f(){} }.f {}
+        } catch (e) {
+            console.log("PASS");
+        }
+    }
+    expect: {
+        "use strict";
+        try {
+            class A extends [ () => {} ][0] {}
+        } catch (e) {
+            console.log("PASS");
+        }
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}