deduplicate parenthesis around object and function literals (#2953)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 24 Feb 2018 18:14:33 +0000 (02:14 +0800)
committerGitHub <noreply@github.com>
Sat, 24 Feb 2018 18:14:33 +0000 (02:14 +0800)
lib/output.js
test/compress/functions.js

index bd1a70c..cf0b41c 100644 (file)
@@ -576,6 +576,7 @@ function OutputStream(options) {
         indentation     : function() { return indentation },
         current_width   : function() { return current_col - indentation },
         should_break    : function() { return options.width && this.current_width() >= options.width },
+        has_parens      : function() { return OUTPUT.slice(-1) == "(" },
         newline         : newline,
         print           : print,
         space           : space,
@@ -683,7 +684,7 @@ function OutputStream(options) {
     // a function expression needs parens around it when it's provably
     // the first token to appear in a statement.
     PARENS(AST_Function, function(output){
-        if (first_in_statement(output)) {
+        if (!output.has_parens() && first_in_statement(output)) {
             return true;
         }
 
@@ -704,7 +705,9 @@ function OutputStream(options) {
 
     // same goes for an object literal, because otherwise it would be
     // interpreted as a block of code.
-    PARENS(AST_Object, first_in_statement);
+    PARENS(AST_Object, function(output){
+        return !output.has_parens() && first_in_statement(output);
+    });
 
     PARENS(AST_Unary, function(output){
         var p = output.parent();
index 29c438a..5d0be0f 100644 (file)
@@ -2012,3 +2012,13 @@ issue_2898: {
     }
     expect_stdout: "2"
 }
+
+deduplicate_parenthesis: {
+    input: {
+        ({}).a = b;
+        (({}).a = b)();
+        (function() {}).a = b;
+        ((function() {}).a = b)();
+    }
+    expect_exact: "({}).a=b;({}.a=b)();(function(){}).a=b;(function(){}.a=b)();"
+}