in legacy/java/piranha/src/main/java/com/uber/piranha/XPFlagCleaner.java [603:676]
private Value evalExpr(ExpressionTree tree, VisitorState state) {
if (tree == null) {
return Value.BOT;
}
Kind k = tree.getKind();
if (k.equals(Kind.PARENTHESIZED)) {
ParenthesizedTree pt = (ParenthesizedTree) tree;
Value v = evalExpr(pt.getExpression(), state);
return v;
}
if (k.equals(Kind.BOOLEAN_LITERAL)) {
LiteralTree lt = (LiteralTree) tree;
if (lt.getValue().equals(Boolean.TRUE)) {
return Value.TRUE;
}
if (lt.getValue().equals(Boolean.FALSE)) {
return Value.FALSE;
}
}
if (k.equals(Kind.LOGICAL_COMPLEMENT)) {
UnaryTree ut = (UnaryTree) tree;
Value e = evalExpr(ut.getExpression(), state);
if (e.equals(Value.FALSE)) {
return Value.TRUE;
}
if (e.equals(Value.TRUE)) {
return Value.FALSE;
}
}
if (k.equals(Kind.METHOD_INVOCATION)) {
API api = getXPAPI(tree, state);
if (api.equals(API.IS_TREATED)) {
return isTreated ? Value.TRUE : Value.FALSE;
} else if (api.equals(API.IS_CONTROL)) {
return isTreated ? Value.FALSE : Value.TRUE;
} else if (api.equals(API.IS_TREATMENT_GROUP_CHECK)) {
return evalTreatmentGroupCheck((MethodInvocationTree) tree) ? Value.TRUE : Value.FALSE;
}
}
if (k.equals(Kind.CONDITIONAL_AND) || k.equals(Kind.CONDITIONAL_OR)) {
BinaryTree bt = (BinaryTree) tree;
Value l = evalExpr(bt.getLeftOperand(), state);
Value r = evalExpr(bt.getRightOperand(), state);
if (k.equals(Kind.CONDITIONAL_OR)) {
if (l.equals(Value.TRUE) || r.equals(Value.TRUE)) {
return Value.TRUE;
}
if (l.equals(Value.FALSE) && r.equals(Value.FALSE)) {
return Value.FALSE;
}
} else if (k.equals(Kind.CONDITIONAL_AND)) {
if (l.equals(Value.TRUE) && r.equals(Value.TRUE)) {
return Value.TRUE;
}
if (l.equals(Value.FALSE) || r.equals(Value.FALSE)) {
return Value.FALSE;
}
}
}
return Value.BOT;
}