fix corner case in `reduce_vars` (#4636)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 10 Feb 2021 02:37:00 +0000 (02:37 +0000)
committerGitHub <noreply@github.com>
Wed, 10 Feb 2021 02:37:00 +0000 (10:37 +0800)
lib/compress.js
test/compress/yields.js

index b35fc6a..a0e018e 100644 (file)
@@ -9836,7 +9836,8 @@ merge(Compressor.prototype, {
                                 }
                             } while (scope = scope.parent_scope);
                         }
-                    } else if (fixed.name && fixed.name.name == "await" && is_async(fixed)) {
+                    } else if (fixed.name && (fixed.name.name == "await" && is_async(fixed)
+                        || fixed.name.name == "yield" && is_generator(fixed))) {
                         single_use = false;
                     }
                     if (single_use) fixed.parent_scope = self.scope;
index 5a6948e..cd2518d 100644 (file)
@@ -255,6 +255,71 @@ collapse_property_lambda: {
     node_version: ">=4"
 }
 
+defun_name: {
+    input: {
+        function* yield() {
+            console.log("PASS");
+        }
+        yield().next();
+    }
+    expect: {
+        function* yield() {
+            console.log("PASS");
+        }
+        yield().next();
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
+
+drop_fname: {
+    rename = true
+    options = {
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    mangle = {
+        toplevel: true,
+    }
+    input: {
+        function* yield() {
+            console.log("PASS");
+        }
+        yield().next();
+    }
+    expect: {
+        (function*() {
+            console.log("PASS");
+        })().next();
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
+
+keep_fname: {
+    options = {
+        keep_fnames: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function* yield() {
+            console.log("PASS");
+        }
+        yield().next();
+    }
+    expect: {
+        function* yield() {
+            console.log("PASS");
+        }
+        yield().next();
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
+
 evaluate: {
     options = {
         evaluate: true,