blob: 8642d29506c2802fad3b9861ad4ae6974bcbf375 [file] [log] [blame]
package org.checkerframework.dataflow.cfg.block;
import java.util.Collections;
import java.util.Set;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.dataflow.analysis.Store.FlowRule;
/**
* A basic block that has at most one successor. SpecialBlockImpl extends this, but exit blocks have
* no successor.
*/
public abstract class SingleSuccessorBlockImpl extends BlockImpl implements SingleSuccessorBlock {
/** Internal representation of the successor. */
protected @Nullable BlockImpl successor;
/**
* The initial value for the rule below says that EACH store at the end of a single successor
* block flows to the corresponding store of the successor.
*/
protected FlowRule flowRule = FlowRule.EACH_TO_EACH;
/**
* Creates a new SingleSuccessorBlock.
*
* @param type the type of this basic block
*/
protected SingleSuccessorBlockImpl(BlockType type) {
super(type);
}
@Override
public @Nullable Block getSuccessor() {
return successor;
}
@Override
public Set<Block> getSuccessors() {
if (successor == null) {
return Collections.emptySet();
} else {
return Collections.singleton(successor);
}
}
/**
* Set a basic block as the successor of this block.
*
* @param successor the block that will be the successor of this
*/
public void setSuccessor(BlockImpl successor) {
this.successor = successor;
successor.addPredecessor(this);
}
@Override
public FlowRule getFlowRule() {
return flowRule;
}
@Override
public void setFlowRule(FlowRule rule) {
flowRule = rule;
}
}