Fix precendence of chained conditional expressions
This ensures chained conditional expressions are evaluated
left-to-right, like Java, instead of right-to-left, like PHP [1].
[1] http://php.net/language.operators.comparison#language.operators.comparison.ternary
MOE_MIGRATED_REVID=137756796
diff --git a/java/com/google/turbine/parse/ConstExpressionParser.java b/java/com/google/turbine/parse/ConstExpressionParser.java
index 7358f5f..87a4e96 100644
--- a/java/com/google/turbine/parse/ConstExpressionParser.java
+++ b/java/com/google/turbine/parse/ConstExpressionParser.java
@@ -516,7 +516,7 @@
return null;
}
eat();
- Tree.Expression elseExpr = expression(TurbineOperatorKind.Precedence.TERNARY);
+ Tree.Expression elseExpr = expression();
if (elseExpr == null) {
return null;
}
diff --git a/java/com/google/turbine/tree/Pretty.java b/java/com/google/turbine/tree/Pretty.java
index 23691b1..7cf9354 100644
--- a/java/com/google/turbine/tree/Pretty.java
+++ b/java/com/google/turbine/tree/Pretty.java
@@ -203,11 +203,13 @@
@Override
public Void visitConditional(Tree.Conditional conditional, Void input) {
+ append("(");
conditional.cond().accept(this, null);
append(" ? ");
conditional.iftrue().accept(this, null);
append(" : ");
conditional.iffalse().accept(this, null);
+ append(")");
return null;
}
diff --git a/javatests/com/google/turbine/parse/ExpressionParserTest.java b/javatests/com/google/turbine/parse/ExpressionParserTest.java
index 7879b9a..9fa96e2 100644
--- a/javatests/com/google/turbine/parse/ExpressionParserTest.java
+++ b/javatests/com/google/turbine/parse/ExpressionParserTest.java
@@ -106,7 +106,7 @@
"((MyType) 42 + c)", "((MyType) 42 + c)",
},
{
- "true || false ? 1 + 2 : 3 + 4", "(true || false) ? (1 + 2) : (3 + 4)",
+ "true || false ? 1 + 2 : 3 + 4", "((true || false) ? (1 + 2) : (3 + 4))",
},
{
"{1, 2, 3,},", "{1, 2, 3}",
@@ -128,7 +128,10 @@
},
{
"0xffffffff", "-1",
- }
+ },
+ {
+ "A ? B : C ? D : E;", "(A ? B : (C ? D : E))",
+ },
});
}
diff --git a/javatests/com/google/turbine/parse/testdata/anno1.input b/javatests/com/google/turbine/parse/testdata/anno1.input
index 0b6eb40..cf0eacb 100644
--- a/javatests/com/google/turbine/parse/testdata/anno1.input
+++ b/javatests/com/google/turbine/parse/testdata/anno1.input
@@ -1,3 +1,3 @@
-@Foo(x = flag ? 0 : (1 + 2))
+@Foo(x = (flag ? 0 : (1 + 2)))
class Test {
}