Search in sources :

Example 1 with Elvis

use of org.springframework.expression.spel.ast.Elvis in project spring-framework by spring-projects.

the class InternalSpelExpressionParser method eatExpression.

// expression
// : logicalOrExpression
// ( (ASSIGN^ logicalOrExpression)
// | (DEFAULT^ logicalOrExpression)
// | (QMARK^ expression COLON! expression)
// | (ELVIS^ expression))?;
@Nullable
private SpelNodeImpl eatExpression() {
    SpelNodeImpl expr = eatLogicalOrExpression();
    Token t = peekToken();
    if (t != null) {
        if (t.kind == TokenKind.ASSIGN) {
            // a=b
            if (expr == null) {
                expr = new NullLiteral(t.startPos - 1, t.endPos - 1);
            }
            nextToken();
            SpelNodeImpl assignedValue = eatLogicalOrExpression();
            return new Assign(t.startPos, t.endPos, expr, assignedValue);
        }
        if (t.kind == TokenKind.ELVIS) {
            // a?:b (a if it isn't null, otherwise b)
            if (expr == null) {
                expr = new NullLiteral(t.startPos - 1, t.endPos - 2);
            }
            // elvis has left the building
            nextToken();
            SpelNodeImpl valueIfNull = eatExpression();
            if (valueIfNull == null) {
                valueIfNull = new NullLiteral(t.startPos + 1, t.endPos + 1);
            }
            return new Elvis(t.startPos, t.endPos, expr, valueIfNull);
        }
        if (t.kind == TokenKind.QMARK) {
            // a?b:c
            if (expr == null) {
                expr = new NullLiteral(t.startPos - 1, t.endPos - 1);
            }
            nextToken();
            SpelNodeImpl ifTrueExprValue = eatExpression();
            eatToken(TokenKind.COLON);
            SpelNodeImpl ifFalseExprValue = eatExpression();
            return new Ternary(t.startPos, t.endPos, expr, ifTrueExprValue, ifFalseExprValue);
        }
    }
    return expr;
}
Also used : SpelNodeImpl(org.springframework.expression.spel.ast.SpelNodeImpl) Ternary(org.springframework.expression.spel.ast.Ternary) Elvis(org.springframework.expression.spel.ast.Elvis) Assign(org.springframework.expression.spel.ast.Assign) NullLiteral(org.springframework.expression.spel.ast.NullLiteral) Nullable(org.springframework.lang.Nullable)

Aggregations

Assign (org.springframework.expression.spel.ast.Assign)1 Elvis (org.springframework.expression.spel.ast.Elvis)1 NullLiteral (org.springframework.expression.spel.ast.NullLiteral)1 SpelNodeImpl (org.springframework.expression.spel.ast.SpelNodeImpl)1 Ternary (org.springframework.expression.spel.ast.Ternary)1 Nullable (org.springframework.lang.Nullable)1