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
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
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 }