View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.dfa;
    5
    6   import net.sourceforge.pmd.ast.SimpleNode;
    7
    8   import java.util.LinkedList;
    9   import java.util.List;
    10  import java.util.Stack;
    11
    12
    13  /**
    14   * @author raik
    15   *         <p/>
    16   *         Structure contains only raw data. A set of nodes wich represent a data flow
    17   *         and 2 stacks to link the nodes to each other.
    18   */
    19  public class Structure {
    20
    21      private LinkedList<DataFlowNode> dataFlow = new LinkedList<DataFlowNode>();
    22      private Stack<StackObject> braceStack = new Stack<StackObject>();
    23      private Stack<StackObject> continueBreakReturnStack = new Stack<StackObject>();
    24
    25      /**
    26       * This class encapsulates the access to the DataFlowNode class. Is this worthwhile?
    27       * TODO I think it's too confusing to have the DataFlowNode constructor
    28       * add the created instance to the LinkedList.  I think it'd be clearer if we did
    29       * that more "procedurally", i.e., create the object, then add it to the list.
    30       */
    31      public IDataFlowNode createNewNode(SimpleNode node) {
    32          return new DataFlowNode(node, this.dataFlow);
    33      }
    34
    35      public IDataFlowNode createStartNode(int line) {
    36          return new StartOrEndDataFlowNode(this.dataFlow, line, true);
    37      }
    38
    39      public IDataFlowNode createEndNode(int line) {
    40          return new StartOrEndDataFlowNode(this.dataFlow, line, false);
    41      }
    42
    43      public IDataFlowNode getLast() {
    44          return this.dataFlow.getLast();
    45      }
    46
    47      public IDataFlowNode getFirst() {
    48          return this.dataFlow.getFirst();
    49      }
    50
    51  //  ----------------------------------------------------------------------------
    52  //	STACK FUNCTIONS
    53
    54      /**
    55       * The braceStack contains all nodes which are important to link the data
    56       * flow nodes. The cbrStack contains continue, break, and return nodes.
    57       * There are 2 Stacks because the have to process differently.
    58       */
    59      protected void pushOnStack(int type, IDataFlowNode node) {
    60          StackObject obj = new StackObject(type, node);
    61          if (type == NodeType.RETURN_STATEMENT
    62          		|| type == NodeType.BREAK_STATEMENT
    63          		|| type == NodeType.CONTINUE_STATEMENT
    64          		|| type == NodeType.THROW_STATEMENT) {
    65              // ugly solution - stores the type information in two ways
    66              continueBreakReturnStack.push(obj);
    67          } else {
    68              braceStack.push(obj);
    69          }
    70          ((DataFlowNode) node).setType(type);
    71      }
    72
    73      public List getBraceStack() {
    74          return braceStack;
    75      }
    76
    77      public List getContinueBreakReturnStack() {
    78          return continueBreakReturnStack;
    79      }
    80
    81  }