/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.dfa.pathfinder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.sourceforge.pmd.lang.dfa.DataFlowNode; import net.sourceforge.pmd.lang.dfa.NodeType; public class CurrentPath { private final List<DataFlowNode> list; public CurrentPath() { list = new ArrayList<>(); } public int getLength() { return list.size(); } public Iterator<DataFlowNode> iterator() { return list.iterator(); } public DataFlowNode getLast() { return list.get(list.size() - 1); } public void removeLast() { list.remove(list.size() - 1); } public boolean isEmpty() { return list.isEmpty(); } public void addLast(DataFlowNode n) { list.add(n); // System.out.println("adding: " + n); } public boolean isDoBranchNode() { return this.getLast().isType(NodeType.DO_EXPR); } public boolean isFirstDoStatement() { return isFirstDoStatement(this.getLast()); } public DataFlowNode getDoBranchNodeFromFirstDoStatement() { if (!isFirstDoStatement()) { return null; } DataFlowNode inode = getLast(); for (DataFlowNode parent : inode.getParents()) { if (parent.isType(NodeType.DO_EXPR)) { return parent; } } return null; } public boolean isEndNode() { return this.getLast().getChildren().size() == 0; // return inode instanceof StartOrEndDataFlowNode; } public boolean isBranch() { return this.getLast().getChildren().size() > 1; } private boolean isFirstDoStatement(DataFlowNode inode) { int index = inode.getIndex() - 1; if (index < 0) { return false; } return inode.getFlow().get(index).isType(NodeType.DO_BEFORE_FIRST_STATEMENT); } }