View Javadoc

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