1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules.design;
5
6 import net.sourceforge.pmd.ast.SimpleNode;
7 import net.sourceforge.pmd.stat.DataPoint;
8 import net.sourceforge.pmd.stat.StatisticalRule;
9
10 /***
11 * This is a common super class for things which
12 * shouldn't have excessive nodes underneath.
13 *
14 * It expects all "visit" calls to return an
15 * Integer. It will sum all the values it gets,
16 * and use that as its score.
17 *
18 * To use it, override the "visit" for the nodes that
19 * need to be counted. On those return "new Integer(1)"
20 *
21 * All others will return 0 (or the sum of counted nodes
22 * underneath.)
23 */
24
25 public class ExcessiveNodeCountRule extends StatisticalRule {
26 private Class nodeClass;
27
28 public ExcessiveNodeCountRule(Class nodeClass) {
29 this.nodeClass = nodeClass;
30 }
31
32 public Object visit(SimpleNode node, Object data) {
33 int numNodes = 0;
34
35 for (int i = 0; i < node.jjtGetNumChildren(); i++) {
36 Integer treeSize = (Integer) (node.jjtGetChild(i)).jjtAccept(this, data);
37 numNodes += treeSize.intValue();
38 }
39
40 if (nodeClass.isInstance(node)) {
41 DataPoint point = new DataPoint();
42 point.setLineNumber(node.getBeginLine());
43 point.setScore(1.0 * numNodes);
44 point.setRule(this);
45 point.setMessage(getMessage());
46 addDataPoint(point);
47 }
48
49 return new Integer(numNodes);
50 }
51 }
This page was automatically generated by Maven