| package org.checkerframework.dataflow.cfg.block; |
| |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import javax.lang.model.type.TypeMirror; |
| |
| import org.checkerframework.dataflow.cfg.node.Node; |
| |
| /** |
| * Base class of the {@link Block} implementation hierarchy. |
| * |
| * @author Stefan Heule |
| * |
| */ |
| public class ExceptionBlockImpl extends SingleSuccessorBlockImpl implements |
| ExceptionBlock { |
| |
| /** Set of exceptional successors. */ |
| protected Map<TypeMirror, Set<Block>> exceptionalSuccessors; |
| |
| public ExceptionBlockImpl() { |
| type = BlockType.EXCEPTION_BLOCK; |
| exceptionalSuccessors = new HashMap<>(); |
| } |
| |
| /** The node of this block. */ |
| protected Node node; |
| |
| /** |
| * Set the node. |
| */ |
| public void setNode(Node c) { |
| node = c; |
| c.setBlock(this); |
| } |
| |
| @Override |
| public Node getNode() { |
| return node; |
| } |
| |
| /** |
| * Add an exceptional successor. |
| */ |
| public void addExceptionalSuccessor(BlockImpl b, |
| TypeMirror cause) { |
| if (exceptionalSuccessors == null) { |
| exceptionalSuccessors = new HashMap<>(); |
| } |
| Set<Block> blocks = exceptionalSuccessors.get(cause); |
| if (blocks == null) { |
| blocks = new HashSet<Block>(); |
| exceptionalSuccessors.put(cause, blocks); |
| } |
| blocks.add(b); |
| b.addPredecessor(this); |
| } |
| |
| @Override |
| public Map<TypeMirror, Set<Block>> getExceptionalSuccessors() { |
| if (exceptionalSuccessors == null) { |
| return Collections.emptyMap(); |
| } |
| return Collections.unmodifiableMap(exceptionalSuccessors); |
| } |
| |
| @Override |
| public String toString() { |
| return "ExceptionBlock(" + node + ")"; |
| } |
| |
| } |