Search in sources :

Example 1 with Token

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();
}
Also used : Operand(com.google.template.soy.exprtree.Operator.Operand) Spacer(com.google.template.soy.exprtree.Operator.Spacer) Token(com.google.template.soy.exprtree.Operator.Token) SyntaxElement(com.google.template.soy.exprtree.Operator.SyntaxElement)

Example 2 with Token

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();
}
Also used : Operand(com.google.template.soy.exprtree.Operator.Operand) Spacer(com.google.template.soy.exprtree.Operator.Spacer) TargetExpr(com.google.template.soy.internal.targetexpr.TargetExpr) Token(com.google.template.soy.exprtree.Operator.Token) SyntaxElement(com.google.template.soy.exprtree.Operator.SyntaxElement)

Aggregations

Operand (com.google.template.soy.exprtree.Operator.Operand)2 Spacer (com.google.template.soy.exprtree.Operator.Spacer)2 SyntaxElement (com.google.template.soy.exprtree.Operator.SyntaxElement)2 Token (com.google.template.soy.exprtree.Operator.Token)2 TargetExpr (com.google.template.soy.internal.targetexpr.TargetExpr)1