fix corner case with `yield` (#4867)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 24 Apr 2021 19:10:12 +0000 (20:10 +0100)
committerGitHub <noreply@github.com>
Sat, 24 Apr 2021 19:10:12 +0000 (03:10 +0800)
lib/output.js
test/compress/yields.js

index ba6785a..4351260 100644 (file)
@@ -482,31 +482,37 @@ function OutputStream(options) {
         return true;
     }
 
+    function should_merge_comments(node, parent) {
+        if (parent instanceof AST_Binary) return parent.left === node;
+        if (parent.TYPE == "Call") return parent.expression === node;
+        if (parent instanceof AST_Conditional) return parent.condition === node;
+        if (parent instanceof AST_Dot) return parent.expression === node;
+        if (parent instanceof AST_Exit) return true;
+        if (parent instanceof AST_Sequence) return parent.expressions[0] === node;
+        if (parent instanceof AST_Sub) return parent.expression === node;
+        if (parent instanceof AST_UnaryPostfix) return true;
+        if (parent instanceof AST_Yield) return true;
+    }
+
     function prepend_comments(node) {
         var self = this;
-        var scan = node instanceof AST_Exit && node.value;
+        var scan;
+        if (node instanceof AST_Exit) {
+            scan = node.value;
+        } else if (node instanceof AST_Yield) {
+            scan = node.expression;
+        }
         var comments = dump(node);
         if (!comments) comments = [];
 
         if (scan) {
             var tw = new TreeWalker(function(node) {
-                var parent = tw.parent();
-                if (parent instanceof AST_Exit
-                    || parent instanceof AST_Binary && parent.left === node
-                    || parent.TYPE == "Call" && parent.expression === node
-                    || parent instanceof AST_Conditional && parent.condition === node
-                    || parent instanceof AST_Dot && parent.expression === node
-                    || parent instanceof AST_Sequence && parent.expressions[0] === node
-                    || parent instanceof AST_Sub && parent.expression === node
-                    || parent instanceof AST_UnaryPostfix) {
-                    var before = dump(node);
-                    if (before) comments = comments.concat(before);
-                } else {
-                    return true;
-                }
+                if (!should_merge_comments(node, tw.parent())) return true;
+                var before = dump(node);
+                if (before) comments = comments.concat(before);
             });
             tw.push(node);
-            node.value.walk(tw);
+            scan.walk(tw);
         }
 
         if (current_pos == 0) {
index d21ebcb..d577d7e 100644 (file)
@@ -150,6 +150,27 @@ for_await_of: {
     node_version: ">=10"
 }
 
+comment_newline: {
+    beautify = {
+        comments: "all",
+    }
+    input: {
+        console.log(function*() {
+            yield (
+                /* */
+                "PASS"
+            );
+        }().next().value);
+    }
+    expect_exact: [
+        "console.log(function*(){",
+        "/* */",
+        'yield"PASS"}().next().value);',
+    ]
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
+
 collapse_vars_1: {
     options = {
         collapse_vars: true,