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  }