View Javadoc

    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<IDataFlowNode> list;
    12
    13      public CurrentPath() {
    14          list = new LinkedList<IDataFlowNode>();
    15      }
    16
    17      public int getLength() {
    18          return list.size();
    19      }
    20
    21      public Iterator<IDataFlowNode> iterator() {
    22          return list.iterator();
    23      }
    24
    25      public IDataFlowNode getLast() {
    26          return list.getLast();
    27      }
    28
    29      public void removeLast() {
    30          list.removeLast();
    31      }
    32
    33      public boolean isEmpty() {
    34          return list.isEmpty();
    35      }
    36
    37      public void addLast(IDataFlowNode n) {
    38          list.addLast(n);
    39          //System.out.println("adding: " + n);
    40      }
    41
    42      public boolean isDoBranchNode() {
    43          return list.getLast().isType(NodeType.DO_EXPR);
    44      }
    45
    46      public boolean isFirstDoStatement() {
    47          return isFirstDoStatement(list.getLast());
    48      }
    49
    50      public IDataFlowNode getDoBranchNodeFromFirstDoStatement() {
    51          IDataFlowNode inode = list.getLast();
    52          if (!isFirstDoStatement()) return null;
    53          for (IDataFlowNode parent: inode.getParents()) {
    54              if (parent.isType(NodeType.DO_EXPR)) {
    55                  return parent;
    56              }
    57          }
    58          return null;
    59      }
    60
    61      public boolean isEndNode() {
    62          return list.getLast().getChildren().size() == 0;
    63          //return inode instanceof StartOrEndDataFlowNode;
    64      }
    65
    66      public boolean isBranch() {
    67          return list.getLast().getChildren().size() > 1;
    68      }
    69
    70      private boolean isFirstDoStatement(IDataFlowNode inode) {
    71          int index = inode.getIndex() - 1;
    72          if (index < 0) return false;
    73          return ((IDataFlowNode) inode.getFlow().get(index)).isType(NodeType.DO_BEFORE_FIRST_STATEMENT);
    74      }
    75  }
    76