org.checkerframework.dataflow.cfg.node.TernaryExpressionNode Maven / Gradle / Ivy
package org.checkerframework.dataflow.cfg.node;
import com.sun.source.tree.ConditionalExpressionTree;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.dataflow.qual.SideEffectFree;
import org.checkerframework.javacutil.TreeUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
/**
* A node for a conditional expression:
*
*
* expression ? expression : expression
*
*/
public class TernaryExpressionNode extends Node {
/** The {@code ConditionalExpressionTree} corresponding to this node */
protected final ConditionalExpressionTree tree;
/** Node representing the condition checked by the expression */
protected final Node condition;
/** Node representing the "then" case of the expression */
protected final Node thenOperand;
/** Node representing the "else" case of the expression */
protected final Node elseOperand;
/**
* This is a variable created by dataflow to which each case expression of the ternary
* expression is assigned. Its value should be used for the value of the switch expression.
*/
private final LocalVariableNode ternaryExpressionVar;
/**
* Creates a new TernaryExpressionNode.
*
* @param tree the {@code ConditionalExpressionTree} for the node
* @param condition node representing the condition checked by the expression
* @param thenOperand node representing the "then" case of the expression
* @param elseOperand node representing the "else" case of the expression
* @param ternaryExpressionVar a variable created by dataflow to which each case expression of
* the ternary expression is assigned. Its value should be used for the value of the switch
* expression.
*/
public TernaryExpressionNode(
ConditionalExpressionTree tree,
Node condition,
Node thenOperand,
Node elseOperand,
LocalVariableNode ternaryExpressionVar) {
super(TreeUtils.typeOf(tree));
this.tree = tree;
this.condition = condition;
this.thenOperand = thenOperand;
this.elseOperand = elseOperand;
this.ternaryExpressionVar = ternaryExpressionVar;
}
/**
* Gets the node representing the conditional operand for this node
*
* @return the condition operand node
*/
public Node getConditionOperand() {
return condition;
}
/**
* Gets the node representing the "then" operand for this node
*
* @return the "then" operand node
*/
public Node getThenOperand() {
return thenOperand;
}
/**
* Gets the node representing the "else" operand for this node
*
* @return the "else" operand node
*/
public Node getElseOperand() {
return elseOperand;
}
/**
* This is a variable created by dataflow to which each case expression of the ternary
* expression is assigned. Its value should be used for the value of the switch expression.
*
* @return the variable for this ternary expression
*/
public LocalVariableNode getTernaryExpressionVar() {
return ternaryExpressionVar;
}
@Override
public ConditionalExpressionTree getTree() {
return tree;
}
@Override
public R accept(NodeVisitor visitor, P p) {
return visitor.visitTernaryExpression(this, p);
}
@Override
public String toString() {
return "("
+ getConditionOperand()
+ " ? "
+ getThenOperand()
+ " : "
+ getElseOperand()
+ ")";
}
@Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof TernaryExpressionNode)) {
return false;
}
TernaryExpressionNode other = (TernaryExpressionNode) obj;
return getConditionOperand().equals(other.getConditionOperand())
&& getThenOperand().equals(other.getThenOperand())
&& getElseOperand().equals(other.getElseOperand());
}
@Override
public int hashCode() {
return Objects.hash(getConditionOperand(), getThenOperand(), getElseOperand());
}
@Override
@SideEffectFree
public Collection getOperands() {
return Arrays.asList(getConditionOperand(), getThenOperand(), getElseOperand());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy