1 package net.sourceforge.pmd.dfa.pathfinder;
2
3 import net.sourceforge.pmd.dfa.IDataFlowNode;
4 import net.sourceforge.pmd.dfa.NodeType;
5
6 import java.util.Iterator;
7 import java.util.LinkedList;
8
9 public class CurrentPath {
10
11 private LinkedList list;
12
13 public CurrentPath() {
14 list = new LinkedList();
15 }
16
17 public Iterator iterator() {
18 return list.iterator();
19 }
20
21 public IDataFlowNode getLast() {
22 return (IDataFlowNode) list.getLast();
23 }
24
25 public void removeLast() {
26 list.removeLast();
27 }
28
29 public boolean isEmpty() {
30 return list.isEmpty();
31 }
32
33 public void addLast(IDataFlowNode n) {
34 list.addLast(n);
35 }
36
37 public boolean isDoBranchNode() {
38 return ((IDataFlowNode) list.getLast()).isType(NodeType.DO_EXPR);
39 }
40
41 public boolean isFirstDoStatement() {
42 return isFirstDoStatement((IDataFlowNode) list.getLast());
43 }
44
45 public IDataFlowNode getDoBranchNodeFromFirstDoStatement() {
46 IDataFlowNode inode = (IDataFlowNode) list.getLast();
47 if (!isFirstDoStatement()) return null;
48 for (int i = 0; i < inode.getParents().size(); i++) {
49 IDataFlowNode parent = (IDataFlowNode) inode.getParents().get(i);
50 if (parent.isType(NodeType.DO_EXPR)) {
51 return parent;
52 }
53 }
54 return null;
55 }
56
57 public boolean isEndNode() {
58 return ((IDataFlowNode) list.getLast()).getChildren().size() == 0;
59
60 }
61
62 public boolean isBranch() {
63 return ((IDataFlowNode) list.getLast()).getChildren().size() > 1;
64 }
65
66 private boolean isFirstDoStatement(IDataFlowNode inode) {
67 int index = inode.getIndex() - 1;
68 if (index < 0) return false;
69 return ((IDataFlowNode) inode.getFlow().get(index)).isType(NodeType.DO_BEFORE_FIRST_STATEMENT);
70 }
71 }
72