Skip to content

Commit aa7bf01

Browse files
committed
Add Parentheses to Right Associative Expressions
1 parent 8c473f7 commit aa7bf01

2 files changed

Lines changed: 13 additions & 4 deletions

File tree

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/formatter/ExpressionFormatter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,22 @@ private boolean needsParentheses(Expression parent, Expression child, boolean ri
7777
if (parent instanceof BinaryExpression parentBinary && child instanceof BinaryExpression childBinary)
7878
return needsBinaryParentheses(parentBinary, childBinary, rightOperand);
7979

80+
if (parent instanceof Ite && child instanceof Ite)
81+
return true;
82+
8083
if (parent instanceof UnaryExpression parentUnary && child instanceof UnaryExpression childUnary)
8184
return parentUnary.getOp().equals("-") && childUnary.getOp().equals("-");
8285

8386
return false;
8487
}
8588

8689
private boolean needsBinaryParentheses(BinaryExpression parent, BinaryExpression child, boolean rightOperand) {
87-
if (rightOperand)
90+
if (rightOperand) {
91+
if (isRightAssociative(parent.getOperator()))
92+
return true;
8893
return !isRightAssociative(parent.getOperator())
8994
&& (!isAssociative(parent.getOperator()) || !parent.getOperator().equals(child.getOperator()));
95+
}
9096
return isRightAssociative(parent.getOperator());
9197
}
9298

liquidjava-verifier/src/test/java/liquidjava/rj_language/ast/ExpressionFormatterTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ void formatsRightGrouping() {
6666
void formatsLogicalExpressions() {
6767
assertEquals("a && b || c", parse("a && b || c").toDisplayString());
6868
assertEquals("a && (b || c)", parse("a && (b || c)").toDisplayString());
69-
assertEquals("a --> b --> c", parse("a --> b --> c").toDisplayString());
69+
assertEquals("a --> (b --> c)", parse("a --> b --> c").toDisplayString());
70+
assertEquals("a --> (b --> c)", parse("a --> (b --> c)").toDisplayString());
71+
assertEquals("a --> (b --> (c --> d))", parse("a --> b --> c --> d").toDisplayString());
7072
assertEquals("(a --> b) --> c", parse("(a --> b) --> c").toDisplayString());
7173
assertEquals("a && b && c", parse("a && b && c").toDisplayString());
7274
assertEquals("a || b || c", parse("a || b || c").toDisplayString());
@@ -77,9 +79,10 @@ void formatsTernaryExpressions() {
7779
assertEquals("(a ? b : c) + d", parse("(a ? b : c) + d").toDisplayString());
7880
assertEquals("(a ? b : c) ? d : e", parse("(a ? b : c) ? d : e").toDisplayString());
7981
assertEquals("a ? (b ? c : d) : e", parse("a ? (b ? c : d) : e").toDisplayString());
80-
assertEquals("a ? b : c ? d : e", parse("a ? b : c ? d : e").toDisplayString());
82+
assertEquals("a ? b : (c ? d : e)", parse("a ? b : c ? d : e").toDisplayString());
8183
assertEquals("(a ? b : c) ? d : e", parse("(a ? b : c) ? d : e").toDisplayString());
82-
assertEquals("a ? b : c ? d : e", parse("a ? b : (c ? d : e)").toDisplayString());
84+
assertEquals("a ? b : (c ? d : e)", parse("a ? b : (c ? d : e)").toDisplayString());
85+
assertEquals("a ? b : (c ? d : (e ? f : g))", parse("a ? b : c ? d : e ? f : g").toDisplayString());
8386
assertEquals("a ? b : c", parse("a ? b : c").toDisplayString());
8487
}
8588
}

0 commit comments

Comments
 (0)