View Javadoc

    1   /*
    2    * Created on 11.07.2004
    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 dataFlow = new LinkedList();
    22      private Stack braceStack = new Stack();
    23      private Stack continueBreakReturnStack = new Stack();
    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 (IDataFlowNode) this.dataFlow.getLast();
    45      }
    46
    47      public IDataFlowNode getFirst() {
    48          return (IDataFlowNode) 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 || type == NodeType.BREAK_STATEMENT || type == NodeType.CONTINUE_STATEMENT) {
    62              // ugly solution - stores the type information in two ways
    63              continueBreakReturnStack.push(obj);
    64          } else {
    65              braceStack.push(obj);
    66          }
    67          ((DataFlowNode) node).setType(type);
    68      }
    69
    70      public List getBraceStack() {
    71          return braceStack;
    72      }
    73
    74      public List getContinueBreakReturnStack() {
    75          return continueBreakReturnStack;
    76      }
    77
    78  }