in projectional/src/main/java/jetbrains/jetpad/projectional/binOp/BinOpTransformer.java [152:183]
public BinExprT balanceDown(BinExprT expr) {
int exprPriority = getPriority(expr);
Associativity assoc = getAssociativity(expr);
ExprT left = left(expr).get();
ExprT right = right(expr).get();
if (isBinOp(left)) {
BinExprT leftExpr = asBinOp(left);
int leftPriority = getPriority(leftExpr);
if ((assoc == Associativity.LEFT && leftPriority < exprPriority) ||
(assoc == Associativity.RIGHT && leftPriority <= exprPriority)) {
BinExprT result = rotateRight(expr);
balanceDown(asBinOp(right(result).get()));
return result;
}
}
if (isBinOp(right)) {
BinExprT rightExpr = asBinOp(right);
int rightPriority = getPriority(rightExpr);
if ((assoc == Associativity.LEFT && rightPriority <= exprPriority) ||
(assoc == Associativity.RIGHT && rightPriority < exprPriority)) {
BinExprT result = rotateLeft(expr);
balanceDown(asBinOp(left(result).get()));
return result;
}
}
return expr;
}