Clover coverage report - PMD - 3.7
Coverage timestamp: Wed May 31 2006 09:25:59 EDT

file stats: | LOC: | 334 |  | Methods: | 39
| NCLOC: | 257 |  | Classes: | 1

Source file | Conditionals | Statements | Methods | TOTAL

SimpleNode.java

69.1%

71.4%

82.1%

72.6%

1 |  | /* Generated By:JJTree: Do not edit this line. SimpleNode.java */
2 |  | package net.sourceforge.pmd.ast;
3 |  |
4 |  | import net.sourceforge.pmd.dfa.IDataFlowNode;
5 |  | import net.sourceforge.pmd.jaxen.Attribute;
6 |  | import net.sourceforge.pmd.jaxen.DocumentNavigator;
7 |  | import net.sourceforge.pmd.symboltable.Scope;
8 |  | import org.apache.xerces.dom.DocumentImpl;
9 |  | import org.jaxen.BaseXPath;
10 |  | import org.jaxen.JaxenException;
11 |  | import org.w3c.dom.Document;
12 |  | import org.w3c.dom.Element;
13 |  |
14 |  | import java.util.ArrayList;
15 |  | import java.util.Iterator;
16 |  | import java.util.List;
17 |  |
18 |  | public abstract class SimpleNode implements Node {
19 |  |
20 |  | protected Node parent;
21 |  | protected Node[] children;
22 |  | protected int id;
23 |  | protected JavaParser parser;
24 |  | private String image;
25 |  | protected int beginLine = -1;
26 |  | protected int endLine;
27 |  | protected int beginColumn = -1;
28 |  | protected int endColumn;
29 |  | private Scope scope;
30 |  | private boolean discardable;
31 |  | private IDataFlowNode dataFlowNode;
32 |  |
33 | 117 | public IDataFlowNode getDataFlowNode() {
34 | 117 | if (this.dataFlowNode == null) {
35 | 37 | if (this.parent != null) {
36 | 37 | return ((SimpleNode) parent).getDataFlowNode();
37 |  | }
38 | 0 | return null; //TODO wise?
39 |  | }
40 | 80 | return dataFlowNode;
41 |  | }
42 |  |
43 | 0 | public void discardIfNecessary() {
44 | 0 | if (discardable) {
45 | 0 | SimpleNode parent = (SimpleNode) this.jjtGetParent();
46 | 0 | SimpleNode kid = (SimpleNode) this.jjtGetChild(0);
47 | 0 | kid.jjtSetParent(parent);
48 | 0 | parent.jjtReplaceChild(this, kid);
49 |  | }
50 |  | }
51 |  |
52 | 211 | public void setDataFlowNode(IDataFlowNode dataFlowNode) {
53 | 211 | this.dataFlowNode = dataFlowNode;
54 |  | }
55 |  |
56 | 6898 | public void setDiscardable() {
57 | 6898 | this.discardable = true;
58 |  | }
59 |  |
60 | 0 | public void setUnDiscardable() {
61 | 0 | this.discardable = false;
62 |  | }
63 |  |
64 | 95250 | public SimpleNode(int i) {
65 | 95250 | id = i;
66 |  | }
67 |  |
68 | 71018 | public SimpleNode(JavaParser p, int i) {
69 | 71018 | this(i);
70 | 71018 | parser = p;
71 |  | }
72 |  |
73 | 28864 | public void setScope(Scope scope) {
74 | 28864 | this.scope = scope;
75 |  | }
76 |  |
77 | 40437 | public Scope getScope() {
78 | 40437 | if (scope == null) {
79 | 28038 | return ((SimpleNode) parent).getScope();
80 |  | }
81 | 12399 | return scope;
82 |  | }
83 |  |
84 | 3115 | public int getBeginLine() {
85 | 3115 | return beginLine;
86 |  | }
87 |  |
88 | 25237 | public void testingOnly__setBeginLine(int i) {
89 | 25237 | this.beginLine = i;
90 |  | }
91 |  |
92 | 45035 | public void testingOnly__setBeginColumn(int i) {
93 | 45035 | this.beginColumn = i;
94 |  | }
95 |  |
96 | 2728 | public int getBeginColumn() {
97 | 2728 | if (beginColumn != -1) {
98 | 2680 | return beginColumn;
99 |  | } else {
100 | 48 | if ((children != null) && (children.length > 0)) {
101 | 48 | return ((SimpleNode) children[0]).getBeginColumn();
102 |  | } else {
103 | 0 | throw new RuntimeException("Unable to determine begining line of Node.");
104 |  | }
105 |  | }
106 |  | }
107 |  |
108 | 29430 | public String getImage() {
109 | 29430 | return image;
110 |  | }
111 |  |
112 | 8755 | public void setImage(String image) {
113 | 8755 | this.image = image;
114 |  | }
115 |  |
116 | 2730 | public int getEndLine() {
117 | 2730 | return endLine;
118 |  | }
119 |  |
120 | 2680 | public int getEndColumn() {
121 | 2680 | return endColumn;
122 |  | }
123 |  |
124 | 27 | public Node getNthParent(int n) {
125 | 27 | Node result = null;
126 | 27 | for (int i = 0; i < n; i++) {
127 | 127 | if (result == null) {
128 | 27 | result = this.jjtGetParent();
129 |  | } else {
130 | 100 | result = result.jjtGetParent();
131 |  | }
132 |  | }
133 | 27 | return result;
134 |  | }
135 |  |
136 |  | /**
137 |  | * Traverses up the tree to find the first parent instance of type parentType
138 |  | *
139 |  | * @param parentType class which you want to find.
140 |  | * @return Node of type parentType. Returns null if none found.
141 |  | */
142 | 6598 | public Node getFirstParentOfType(Class parentType) {
143 | 6598 | Node parentNode = jjtGetParent();
144 | 6598 | while (parentNode != null && parentNode.getClass() != parentType) {
145 | 9900 | parentNode = parentNode.jjtGetParent();
146 |  | }
147 | 6598 | return parentNode;
148 |  | }
149 |  |
150 |  | /**
151 |  | * Traverses up the tree to find all of the parent instances of type parentType
152 |  | *
153 |  | * @param parentType classes which you want to find.
154 |  | * @return List of parentType instances found.
155 |  | */
156 | 10719 | public List getParentsOfType(Class parentType) {
157 | 10719 | List parents = new ArrayList();
158 | 10719 | Node parentNode = jjtGetParent();
159 | 10719 | while (parentNode != null) {
160 | 18731 | if (parentNode.getClass() == parentType) {
161 | 1056 | parents.add(parentNode);
162 |  | }
163 | 18731 | parentNode = parentNode.jjtGetParent();
164 |  | }
165 | 10719 | return parents;
166 |  | }
167 |  |
168 | 1687 | public List findChildrenOfType(Class targetType) {
169 | 1687 | List list = new ArrayList();
170 | 1687 | findChildrenOfType(targetType, list);
171 | 1687 | return list;
172 |  | }
173 |  |
174 | 1710 | public void findChildrenOfType(Class targetType, List results) {
175 | 1710 | findChildrenOfType(this, targetType, results, true);
176 |  | }
177 |  |
178 | 45 | public void findChildrenOfType(Class targetType, List results, boolean descendIntoNestedClasses) {
179 | 45 | this.findChildrenOfType(this, targetType, results, descendIntoNestedClasses);
180 |  | }
181 |  |
182 | 37002 | private void findChildrenOfType(Node node, Class targetType, List results, boolean descendIntoNestedClasses) {
183 | 37002 | if (node.getClass().equals(targetType)) {
184 | 324 | results.add(node);
185 |  | }
186 |  |
187 | 37002 | if (!descendIntoNestedClasses) {
188 | 650 | if (node instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration) node).isNested()) {
189 | 0 | return;
190 |  | }
191 |  |
192 | 650 | if (node instanceof ASTClassOrInterfaceBodyDeclaration && ((ASTClassOrInterfaceBodyDeclaration) node).isAnonymousInnerClass()) {
193 | 4 | return;
194 |  | }
195 |  | }
196 |  |
197 | 36998 | for (int i = 0; i < node.jjtGetNumChildren(); i++) {
198 | 46127 | Node child = node.jjtGetChild(i);
199 | 46127 | if (child.jjtGetNumChildren() > 0) {
200 | 35247 | findChildrenOfType(child, targetType, results, descendIntoNestedClasses);
201 |  | } else {
202 | 10880 | if (child.getClass().equals(targetType)) {
203 | 135 | results.add(child);
204 |  | }
205 |  | }
206 |  | }
207 |  | }
208 |  |
209 | 38930 | public void jjtSetParent(Node n) {
210 | 38930 | parent = n;
211 |  | }
212 |  |
213 | 139465 | public Node jjtGetParent() {
214 | 139465 | return parent;
215 |  | }
216 |  |
217 | 1 | public void jjtReplaceChild(Node old, Node newNode) {
218 | 1 | for (int i = 0; i < children.length; i++) {
219 | 1 | if (children[i] == old) {
220 | 1 | children[i] = newNode;
221 | 1 | return;
222 |  | }
223 |  | }
224 | 0 | throw new RuntimeException("PMD INTERNAL ERROR: SimpleNode.jjtReplaceChild called to replace a node, but couldn't find the old node");
225 |  | }
226 |  |
227 | 38951 | public void jjtAddChild(Node n, int i) {
228 | 38951 | if (children == null) {
229 | 31258 | children = new Node[i + 1];
230 | 7693 | } else if (i >= children.length) {
231 | 5 | Node c[] = new Node[i + 1];
232 | 5 | System.arraycopy(children, 0, c, 0, children.length);
233 | 5 | children = c;
234 |  | }
235 | 38951 | children[i] = n;
236 |  | }
237 |  |
238 | 155846 | public Node jjtGetChild(int i) {
239 | 155846 | return children[i];
240 |  | }
241 |  |
242 | 274434 | public int jjtGetNumChildren() {
243 | 274434 | return (children == null) ? 0 : children.length;
244 |  | }
245 |  |
246 | 0 | public String toString(String prefix) {
247 | 0 | return prefix + toString();
248 |  | }
249 |  |
250 | 0 | public Document asXml() {
251 | 0 | Document document = new DocumentImpl();
252 | 0 | appendElement(document);
253 | 0 | return document;
254 |  | }
255 |  |
256 | 0 | protected void appendElement(org.w3c.dom.Node parentNode) {
257 | 0 | DocumentNavigator docNav = new DocumentNavigator();
258 | 0 | Document ownerDocument = parentNode.getOwnerDocument();
259 | 0 | if (ownerDocument == null) {
260 |  | //If the parentNode is a Document itself, it's ownerDocument is null
261 | 0 | ownerDocument = (Document) parentNode;
262 |  | }
263 | 0 | String elementName = docNav.getElementName(this);
264 | 0 | Element element = ownerDocument.createElement(elementName);
265 | 0 | parentNode.appendChild(element);
266 | 0 | for (Iterator iter = docNav.getAttributeAxisIterator(this); iter.hasNext();) {
267 | 0 | Attribute attr = (Attribute) iter.next();
268 | 0 | element.setAttribute(attr.getName(), attr.getValue());
269 |  | }
270 | 0 | for (Iterator iter = docNav.getChildAxisIterator(this); iter.hasNext();) {
271 | 0 | SimpleNode child = (SimpleNode) iter.next();
272 | 0 | child.appendElement(element);
273 |  | }
274 |  | }
275 |  |
276 |  | /* Override this method if you want to customize how the node dumps
277 |  | out its children. */
278 | 0 | public void dump(String prefix) {
279 | 0 | System.out.println(toString(prefix) + (image == null ? "" : ":" + image));
280 | 0 | dumpChildren(prefix);
281 |  | }
282 |  |
283 | 0 | protected void dumpChildren(String prefix) {
284 | 0 | if (children != null) {
285 | 0 | for (int i = 0; i < children.length; ++i) {
286 | 0 | SimpleNode n = (SimpleNode) children[i];
287 | 0 | if (n != null) {
288 | 0 | n.dump(prefix + " ");
289 |  | }
290 |  | }
291 |  | }
292 |  | }
293 |  |
294 |  |
295 |  | /**
296 |  | * Traverses down the tree to find the first child instance of type childType
297 |  | *
298 |  | * @param childType class which you want to find.
299 |  | * @return Node of type childType. Returns <code>null</code> if none found.
300 |  | */
301 | 1727 | public Node getFirstChildOfType(Class childType) {
302 | 1727 | return getFirstChildOfType(childType, this);
303 |  | }
304 |  |
305 | 5548 | private Node getFirstChildOfType(Class childType, Node node) {
306 | 5548 | for (int i = 0; i < node.jjtGetNumChildren(); i++) {
307 | 5489 | Node n = node.jjtGetChild(i);
308 | 5489 | if (n != null) {
309 | 5487 | if (n.getClass().equals(childType))
310 | 1666 | return n;
311 | 3821 | Node n2 = getFirstChildOfType(childType, n);
312 | 3821 | if (n2 != null)
313 | 1560 | return n2;
314 |  | }
315 |  | }
316 | 2322 | return null;
317 |  | }
318 |  |
319 |  | /**
320 |  | * Finds if this node contains a child of the given type.
321 |  | * This is an utility method that uses {@link #findChildrenOfType(Class)}
322 |  | *
323 |  | * @param type the node type to search
324 |  | * @return <code>true</code> if there is at lease on child of the given type and <code>false</code> in any other case
325 |  | */
326 | 8 | public final boolean containsChildOfType(Class type) {
327 | 8 | return !findChildrenOfType(type).isEmpty();
328 |  | }
329 |  |
330 | 9 | public List findChildNodesWithXPath(String xpathString) throws JaxenException {
331 | 9 | return new BaseXPath(xpathString, new DocumentNavigator()).selectNodes(this);
332 |  | }
333 |  | }
334 |  |