retain comments within brackets (#2999)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 13 Mar 2018 10:44:21 +0000 (18:44 +0800)
committerGitHub <noreply@github.com>
Tue, 13 Mar 2018 10:44:21 +0000 (18:44 +0800)
fixes #2998

lib/output.js
test/mocha/comment.js

index 0569ab5..0aaec42 100644 (file)
@@ -886,18 +886,19 @@ function OutputStream(options) {
         self.body.print(output);
         output.semicolon();
     });
+    function print_bracketed_empty(self, output) {
+        output.print("{");
+        output.with_indent(output.next_indent(), function() {
+            output.append_comments(self, true);
+        });
+        output.print("}");
+    }
     function print_bracketed(self, output, allow_directives) {
         if (self.body.length > 0) {
             output.with_block(function() {
                 display_body(self.body, false, output, allow_directives);
             });
-        } else {
-            output.print("{");
-            output.with_indent(output.next_indent(), function() {
-                output.append_comments(self, true);
-            });
-            output.print("}");
-        }
+        } else print_bracketed_empty(self, output);
     };
     DEFPRINT(AST_BlockStatement, function(self, output){
         print_bracketed(self, output);
@@ -1092,7 +1093,7 @@ function OutputStream(options) {
         });
         output.space();
         var last = self.body.length - 1;
-        if (last < 0) output.print("{}");
+        if (last < 0) print_bracketed_empty(self, output);
         else output.with_block(function(){
             self.body.forEach(function(branch, i){
                 output.indent(true);
@@ -1347,7 +1348,7 @@ function OutputStream(options) {
             });
             output.newline();
         });
-        else output.print("{}");
+        else print_bracketed_empty(self, output);
     });
 
     function print_property_name(key, quote, output) {
index 4db46b5..74ae962 100644 (file)
@@ -139,6 +139,26 @@ describe("Comment", function() {
         assert.strictEqual(result.code, code);
     });
 
+    it("Should retain comments within brackets", function() {
+        var code = [
+            "{/* foo */}",
+            "a({/* foo */});",
+            "while (a) {/* foo */}",
+            "switch (a) {/* foo */}",
+            "if (a) {/* foo */} else {/* bar */}",
+        ].join("\n\n");
+        var result = uglify.minify(code, {
+            compress: false,
+            mangle: false,
+            output: {
+                beautify: true,
+                comments: "all",
+            },
+        });
+        if (result.error) throw result.error;
+        assert.strictEqual(result.code, code);
+    });
+
     it("Should correctly preserve new lines around comments", function() {
         var tests = [
             [