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