use of com.google.template.soy.exprtree.Operator.Token in project closure-templates by google.
the class AbstractOperatorNode method toSourceString.
@Override
public String toSourceString() {
boolean isLeftAssociative = operator.getAssociativity() == Associativity.LEFT;
StringBuilder sourceSb = new StringBuilder();
List<SyntaxElement> syntax = operator.getSyntax();
for (int i = 0, n = syntax.size(); i < n; ++i) {
SyntaxElement syntaxEl = syntax.get(i);
if (syntaxEl instanceof Operand) {
Operand operand = (Operand) syntaxEl;
// ternary operator doesn't need protection either, but we do it anyway for readability.)
if (i == (isLeftAssociative ? 0 : n - 1)) {
sourceSb.append(getOperandProtectedForLowerPrec(operand.getIndex()));
} else {
sourceSb.append(getOperandProtectedForLowerOrEqualPrec(operand.getIndex()));
}
} else if (syntaxEl instanceof Token) {
sourceSb.append(((Token) syntaxEl).getValue());
} else if (syntaxEl instanceof Spacer) {
sourceSb.append(' ');
} else {
throw new AssertionError();
}
}
return sourceSb.toString();
}
use of com.google.template.soy.exprtree.Operator.Token in project closure-templates by google.
the class PyExprUtils method genExprWithNewToken.
/**
* Generates an expression for the given operator and operands assuming that the expression for
* the operator uses the same syntax format as the Soy operator, with the exception that the of a
* different token. Associativity, spacing, and precedence are maintained from the original
* operator.
*
* <p>Examples:
*
* <pre>
* NOT, ["$a"], "!" -> "! $a"
* AND, ["$a", "$b"], "&&" -> "$a && $b"
* NOT, ["$a * $b"], "!"; -> "! ($a * $b)"
* </pre>
*
* @param op The operator.
* @param operandExprs The operands.
* @param newToken The language specific token equivalent to the operator's original token.
* @return The generated expression with a new token.
*/
public static String genExprWithNewToken(Operator op, List<? extends TargetExpr> operandExprs, String newToken) {
int opPrec = op.getPrecedence();
boolean isLeftAssociative = op.getAssociativity() == Associativity.LEFT;
StringBuilder exprSb = new StringBuilder();
// Iterate through the operator's syntax elements.
List<SyntaxElement> syntax = op.getSyntax();
for (int i = 0, n = syntax.size(); i < n; i++) {
SyntaxElement syntaxEl = syntax.get(i);
if (syntaxEl instanceof Operand) {
// Retrieve the operand's subexpression.
int operandIndex = ((Operand) syntaxEl).getIndex();
TargetExpr operandExpr = operandExprs.get(operandIndex);
// If left (right) associative, first (last) operand doesn't need protection if it's an
// operator of equal precedence to this one.
boolean needsProtection;
if (i == (isLeftAssociative ? 0 : n - 1)) {
needsProtection = operandExpr.getPrecedence() < opPrec;
} else {
needsProtection = operandExpr.getPrecedence() <= opPrec;
}
// Append the operand's subexpression to the expression we're building (if necessary,
// protected using parentheses).
String subexpr = needsProtection ? "(" + operandExpr.getText() + ")" : operandExpr.getText();
exprSb.append(subexpr);
} else if (syntaxEl instanceof Token) {
// If a newToken is supplied, then use it, else use the token defined by Soy syntax.
if (newToken != null) {
exprSb.append(newToken);
} else {
exprSb.append(((Token) syntaxEl).getValue());
}
} else if (syntaxEl instanceof Spacer) {
// Spacer is just one space.
exprSb.append(' ');
} else {
throw new AssertionError();
}
}
return exprSb.toString();
}
Aggregations