Search in sources :

Example 1 with Ternary

use of cn.taketoday.expression.spel.ast.Ternary in project today-infrastructure by TAKETODAY.

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(cn.taketoday.expression.spel.ast.SpelNodeImpl) Ternary(cn.taketoday.expression.spel.ast.Ternary) Elvis(cn.taketoday.expression.spel.ast.Elvis) Assign(cn.taketoday.expression.spel.ast.Assign) NullLiteral(cn.taketoday.expression.spel.ast.NullLiteral) Nullable(cn.taketoday.lang.Nullable)

Example 2 with Ternary

use of cn.taketoday.expression.spel.ast.Ternary in project today-framework by TAKETODAY.

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(cn.taketoday.expression.spel.ast.SpelNodeImpl) Ternary(cn.taketoday.expression.spel.ast.Ternary) Elvis(cn.taketoday.expression.spel.ast.Elvis) Assign(cn.taketoday.expression.spel.ast.Assign) NullLiteral(cn.taketoday.expression.spel.ast.NullLiteral) Nullable(cn.taketoday.lang.Nullable)

Example 3 with Ternary

use of cn.taketoday.expression.spel.ast.Ternary in project today-framework by TAKETODAY.

the class SpelCompilationCoverageTests method mixingItUp_propertyAccessIndexerOpLtTernaryRootNull.

@Test
void mixingItUp_propertyAccessIndexerOpLtTernaryRootNull() {
    Payload payload = new Payload();
    expression = parser.parseExpression("DR[0].three");
    Object v = expression.getValue(payload);
    assertThat(getAst().getExitDescriptor()).isEqualTo("Lcn/taketoday/expression/spel/SpelCompilationCoverageTests$Three");
    Expression expression = parser.parseExpression("DR[0].three.four lt 0.1d?#root:null");
    v = expression.getValue(payload);
    SpelExpression sExpr = (SpelExpression) expression;
    Ternary ternary = (Ternary) sExpr.getAST();
    OpLT oplt = (OpLT) ternary.getChild(0);
    CompoundExpression cExpr = (CompoundExpression) oplt.getLeftOperand();
    String cExprExitDescriptor = cExpr.getExitDescriptor();
    assertThat(cExprExitDescriptor).isEqualTo("D");
    assertThat(oplt.getExitDescriptor()).isEqualTo("Z");
    assertCanCompile(expression);
    Object vc = expression.getValue(payload);
    assertThat(v).isEqualTo(payload);
    assertThat(vc).isEqualTo(payload);
    payload.DR[0].three.four = 0.13d;
    vc = expression.getValue(payload);
    assertThat(vc).isNull();
}
Also used : Expression(cn.taketoday.expression.Expression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) Ternary(cn.taketoday.expression.spel.ast.Ternary) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) OpLT(cn.taketoday.expression.spel.ast.OpLT) Test(org.junit.jupiter.api.Test)

Example 4 with Ternary

use of cn.taketoday.expression.spel.ast.Ternary in project today-infrastructure by TAKETODAY.

the class SpelCompilationCoverageTests method mixingItUp_propertyAccessIndexerOpLtTernaryRootNull.

@Test
void mixingItUp_propertyAccessIndexerOpLtTernaryRootNull() {
    Payload payload = new Payload();
    expression = parser.parseExpression("DR[0].three");
    Object v = expression.getValue(payload);
    assertThat(getAst().getExitDescriptor()).isEqualTo("Lcn/taketoday/expression/spel/SpelCompilationCoverageTests$Three");
    Expression expression = parser.parseExpression("DR[0].three.four lt 0.1d?#root:null");
    v = expression.getValue(payload);
    SpelExpression sExpr = (SpelExpression) expression;
    Ternary ternary = (Ternary) sExpr.getAST();
    OpLT oplt = (OpLT) ternary.getChild(0);
    CompoundExpression cExpr = (CompoundExpression) oplt.getLeftOperand();
    String cExprExitDescriptor = cExpr.getExitDescriptor();
    assertThat(cExprExitDescriptor).isEqualTo("D");
    assertThat(oplt.getExitDescriptor()).isEqualTo("Z");
    assertCanCompile(expression);
    Object vc = expression.getValue(payload);
    assertThat(v).isEqualTo(payload);
    assertThat(vc).isEqualTo(payload);
    payload.DR[0].three.four = 0.13d;
    vc = expression.getValue(payload);
    assertThat(vc).isNull();
}
Also used : Expression(cn.taketoday.expression.Expression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) Ternary(cn.taketoday.expression.spel.ast.Ternary) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) OpLT(cn.taketoday.expression.spel.ast.OpLT) Test(org.junit.jupiter.api.Test)

Aggregations

Ternary (cn.taketoday.expression.spel.ast.Ternary)4 Expression (cn.taketoday.expression.Expression)2 Assign (cn.taketoday.expression.spel.ast.Assign)2 CompoundExpression (cn.taketoday.expression.spel.ast.CompoundExpression)2 Elvis (cn.taketoday.expression.spel.ast.Elvis)2 NullLiteral (cn.taketoday.expression.spel.ast.NullLiteral)2 OpLT (cn.taketoday.expression.spel.ast.OpLT)2 SpelNodeImpl (cn.taketoday.expression.spel.ast.SpelNodeImpl)2 SpelExpression (cn.taketoday.expression.spel.standard.SpelExpression)2 Nullable (cn.taketoday.lang.Nullable)2 Test (org.junit.jupiter.api.Test)2