Clover coverage report - PMD - 3.9
Coverage timestamp: Tue Dec 19 2006 09:38:44 EST
file stats: LOC: 180   Methods: 19
NCLOC: 116   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
AbstractNcssCount.java 58.3% 48.9% 21.1% 43.4%
coverage coverage
 1    package net.sourceforge.pmd.rules.codesize;
 2   
 3    import net.sourceforge.pmd.ast.ASTBreakStatement;
 4    import net.sourceforge.pmd.ast.ASTCatchStatement;
 5    import net.sourceforge.pmd.ast.ASTContinueStatement;
 6    import net.sourceforge.pmd.ast.ASTDoStatement;
 7    import net.sourceforge.pmd.ast.ASTFinallyStatement;
 8    import net.sourceforge.pmd.ast.ASTForInit;
 9    import net.sourceforge.pmd.ast.ASTForStatement;
 10    import net.sourceforge.pmd.ast.ASTIfStatement;
 11    import net.sourceforge.pmd.ast.ASTLabeledStatement;
 12    import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
 13    import net.sourceforge.pmd.ast.ASTReturnStatement;
 14    import net.sourceforge.pmd.ast.ASTStatementExpression;
 15    import net.sourceforge.pmd.ast.ASTStatementExpressionList;
 16    import net.sourceforge.pmd.ast.ASTSwitchLabel;
 17    import net.sourceforge.pmd.ast.ASTSwitchStatement;
 18    import net.sourceforge.pmd.ast.ASTSynchronizedStatement;
 19    import net.sourceforge.pmd.ast.ASTThrowStatement;
 20    import net.sourceforge.pmd.ast.ASTWhileStatement;
 21    import net.sourceforge.pmd.ast.SimpleJavaNode;
 22    import net.sourceforge.pmd.stat.DataPoint;
 23    import net.sourceforge.pmd.stat.StatisticalRule;
 24    import net.sourceforge.pmd.util.NumericConstants;
 25   
 26    /**
 27    * Abstract superclass for NCSS counting methods. Counts tokens according to <a
 28    * href="http://www.kclee.de/clemens/java/javancss/">JavaNCSS rules</a>.
 29    *
 30    * @author Jason Bennett
 31    */
 32    public abstract class AbstractNcssCount extends StatisticalRule {
 33   
 34    private Class nodeClass;
 35   
 36    /**
 37    * Count the nodes of the given type using NCSS rules.
 38    *
 39    * @param nodeClass
 40    * class of node to count
 41    */
 42  39 protected AbstractNcssCount(Class nodeClass) {
 43  39 this.nodeClass = nodeClass;
 44    }
 45   
 46  306 public Object visit(SimpleJavaNode node, Object data) {
 47  306 int numNodes = 0;
 48   
 49  306 for ( int i = 0; i < node.jjtGetNumChildren(); i++ ) {
 50  367 SimpleJavaNode simpleNode = (SimpleJavaNode) node.jjtGetChild( i );
 51  367 Integer treeSize = (Integer) simpleNode.jjtAccept( this, data );
 52  367 numNodes += treeSize.intValue();
 53    }
 54   
 55  306 if ( this.nodeClass.isInstance( node ) ) {
 56    // Add 1 to account for base node
 57  12 numNodes++;
 58  12 DataPoint point = new DataPoint();
 59  12 point.setNode( node );
 60  12 point.setScore( 1.0 * numNodes );
 61  12 point.setMessage( getMessage() );
 62  12 addDataPoint( point );
 63    }
 64   
 65  306 return new Integer( numNodes );
 66    }
 67   
 68    /**
 69    * Count the number of children of the given Java node. Adds one to count the
 70    * node itself.
 71    *
 72    * @param node
 73    * java node having children counted
 74    * @param data
 75    * node data
 76    * @return count of the number of children of the node, plus one
 77    */
 78  4 protected Integer countNodeChildren(SimpleJavaNode node, Object data) {
 79  4 Integer nodeCount = null;
 80  4 int lineCount = 0;
 81  4 for ( int i = 0; i < node.jjtGetNumChildren(); i++ ) {
 82  12 nodeCount = (Integer) ( (SimpleJavaNode) node.jjtGetChild( i ) ).jjtAccept(
 83    this, data );
 84  12 lineCount += nodeCount.intValue();
 85    }
 86  4 return new Integer( ++lineCount );
 87    }
 88   
 89  0 public Object visit(ASTForStatement node, Object data) {
 90  0 return countNodeChildren( node, data );
 91    }
 92   
 93  0 public Object visit(ASTDoStatement node, Object data) {
 94  0 return countNodeChildren( node, data );
 95    }
 96   
 97  0 public Object visit(ASTIfStatement node, Object data) {
 98   
 99  0 Integer lineCount = countNodeChildren( node, data );
 100   
 101  0 if ( node.hasElse() ) {
 102  0 int lines = lineCount.intValue();
 103  0 lines++;
 104  0 lineCount = new Integer( lines );
 105    }
 106   
 107  0 return lineCount;
 108    }
 109   
 110  0 public Object visit(ASTWhileStatement node, Object data) {
 111  0 return countNodeChildren( node, data );
 112    }
 113   
 114  0 public Object visit(ASTBreakStatement node, Object data) {
 115  0 return NumericConstants.ONE;
 116    }
 117   
 118  0 public Object visit(ASTCatchStatement node, Object data) {
 119  0 return countNodeChildren( node, data );
 120    }
 121   
 122  0 public Object visit(ASTContinueStatement node, Object data) {
 123  0 return NumericConstants.ONE;
 124    }
 125   
 126  0 public Object visit(ASTFinallyStatement node, Object data) {
 127  0 return countNodeChildren( node, data );
 128    }
 129   
 130  0 public Object visit(ASTReturnStatement node, Object data) {
 131  0 return countNodeChildren( node, data );
 132    }
 133   
 134  0 public Object visit(ASTSwitchStatement node, Object data) {
 135  0 return countNodeChildren( node, data );
 136    }
 137   
 138  0 public Object visit(ASTSynchronizedStatement node, Object data) {
 139  0 return countNodeChildren( node, data );
 140    }
 141   
 142  0 public Object visit(ASTThrowStatement node, Object data) {
 143  0 return NumericConstants.ONE;
 144    }
 145   
 146  81 public Object visit(ASTStatementExpression node, Object data) {
 147   
 148    // "For" update expressions do not count as separate lines of code
 149  81 if ( node.jjtGetParent() instanceof ASTStatementExpressionList ) {
 150  0 return NumericConstants.ZERO;
 151    }
 152   
 153  81 return NumericConstants.ONE;
 154    }
 155   
 156  0 public Object visit(ASTLabeledStatement node, Object data) {
 157  0 return countNodeChildren( node, data );
 158    }
 159   
 160  0 public Object visit(ASTLocalVariableDeclaration node, Object data) {
 161   
 162    // "For" init declarations do not count as separate lines of code
 163  0 if ( node.jjtGetParent() instanceof ASTForInit ) {
 164  0 return NumericConstants.ZERO;
 165    }
 166   
 167    /*
 168    * This will count variables declared on the same line as separate NCSS
 169    * counts. This violates JavaNCSS standards, but I'm not convinced that's a
 170    * bad thing here.
 171    */
 172   
 173  0 return countNodeChildren( node, data );
 174    }
 175   
 176  0 public Object visit(ASTSwitchLabel node, Object data) {
 177  0 return countNodeChildren( node, data );
 178    }
 179   
 180    }