Clover coverage report - PMD - 3.7 Coverage timestamp: Wed May 31 2006 09:25:59 EDT FRAMES NO FRAMES |
file stats: | LOC: | 78 |  | Methods: | 8
| NCLOC: | 40 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
Structure.java | 100% | 91.7% | 87.5% | 90.9% |

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 | 211 | public IDataFlowNode createNewNode(SimpleNode node) {
32 | 211 | return new DataFlowNode(node, this.dataFlow);
33 |  | }
34 |  |
35 | 40 | public IDataFlowNode createStartNode(int line) {
36 | 40 | return new StartOrEndDataFlowNode(this.dataFlow, line, true);
37 |  | }
38 |  |
39 | 40 | public IDataFlowNode createEndNode(int line) {
40 | 40 | return new StartOrEndDataFlowNode(this.dataFlow, line, false);
41 |  | }
42 |  |
43 | 203 | public IDataFlowNode getLast() {
44 | 203 | return (IDataFlowNode) this.dataFlow.getLast();
45 |  | }
46 |  |
47 | 0 | public IDataFlowNode getFirst() {
48 | 0 | 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 | 203 | protected void pushOnStack(int type, IDataFlowNode node) {
60 | 203 | StackObject obj = new StackObject(type, node);
61 | 203 | if (type == NodeType.RETURN_STATEMENT || type == NodeType.BREAK_STATEMENT || type == NodeType.CONTINUE_STATEMENT) {
62 |  | // ugly solution - stores the type information in two ways
63 | 6 | continueBreakReturnStack.push(obj);
64 |  | } else {
65 | 197 | braceStack.push(obj);
66 |  | }
67 | 203 | ((DataFlowNode) node).setType(type);
68 |  | }
69 |  |
70 | 40 | public List getBraceStack() {
71 | 40 | return braceStack;
72 |  | }
73 |  |
74 | 40 | public List getContinueBreakReturnStack() {
75 | 40 | return continueBreakReturnStack;
76 |  | }
77 |  |
78 |  | }