Fixes issue #1907.  Puts parentheses around a comma expression that appears inside of an object literal.  Also adds tests to ensure correctness.

Patch by: sgross
Review by: me


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1604 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
index bf07541..0bba5c0 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
@@ -618,9 +618,9 @@
       }
       _colon();
       JsExpression valueExpr = propInit.getValueExpr();
-      _parenPushIfConditional(valueExpr);
+      _parenPushIfCommaExpr(valueExpr);
       accept(valueExpr);
-      _parenPopIfConditional(valueExpr);
+      _parenPopIfCommaExpr(valueExpr);
     }
     _rbrace();
     return false;
@@ -1003,14 +1003,6 @@
     return doPop;
   }
 
-  private boolean _parenPopIfConditional(JsExpression x) {
-    boolean doPop = x instanceof JsConditional;
-    if (doPop) {
-      _rparen();
-    }
-    return doPop;
-  }
-
   private boolean _parenPopOrSpace(JsExpression parent, JsExpression child,
       boolean wrongAssoc) {
     boolean doPop = _parenCalc(parent, child, wrongAssoc);
@@ -1040,14 +1032,6 @@
     return doPush;
   }
 
-  private boolean _parenPushIfConditional(JsExpression x) {
-    boolean doPush = x instanceof JsConditional;
-    if (doPush) {
-      _lparen();
-    }
-    return doPush;
-  }
-
   private boolean _parenPushOrSpace(JsExpression parent, JsExpression child,
       boolean wrongAssoc) {
     boolean doPush = _parenCalc(parent, child, wrongAssoc);
diff --git a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
index 6c05c22..3e63efb 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
@@ -43,6 +43,10 @@
     doTest("[1,2,3,4][2]");
   }
 
+  public void testArrayLiteralParentheses() throws Exception {
+    doTest("var x = [a, (b, c), d]");
+  }
+
   public void testComplexConstruction() throws Exception {
     doTest("(new (new (a(({a : 'b', c : 'd'}),[1,2,3,x,y,z]))())())()");
   }
@@ -80,6 +84,10 @@
     doTest("({ 'property' : 'value'})");
   }
 
+  public void testObjectLiteralConditional() throws Exception {
+    doTest("var x = {a : ((b(), c) ? d : e)}");
+  }
+
   public void testObjectLiteralDeclaration() throws Exception {
     // quotes are necessary around some property variables
     doTest("var x = {'abc\\'' : 'value'}");
@@ -87,6 +95,10 @@
     doTest("var x = {\"\\'\\\"\" : 'value'}");
   }
 
+  public void testObjectLiteralParentheses() throws Exception {
+    doTest("var x = {a : (c, d), b : 3}");
+  }
+
   public void testUnaryOperations() throws Exception {
     // spaces or parentheses are necessary to separate negation and decrement
     doTest("var x = -(-(--y))");
diff --git a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorConcisenessTest.java b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorConcisenessTest.java
index e77f01b..a0943a7 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorConcisenessTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorConcisenessTest.java
@@ -50,6 +50,16 @@
     assertEquals("var x=y++-z", parse("var x = (y++) - z"));
   }
 
+  public void testObjectLiteralAssignment() throws Exception {
+    assertEquals("var x={a:b=2,c:d}", parse("var x = {a : (b = 2), c : d}"));
+  }
+
+  public void testObjectLiteralConditional() throws Exception {
+    // the parentheses are not required around the conditional
+    assertEquals("var x={a:b?c:d,e:f}",
+        parse("var x = {a : (b ? c : d), e : f}"));
+  }
+
   public void testObjectLiteralDeclarationConcise() throws Exception {
     // quotes are not necessary around many property variables in object
     // literals