1 package net.sourceforge.pmd.rules.codesize;
2
3 import java.util.Iterator;
4 import java.util.Set;
5
6 import net.sourceforge.pmd.RuleContext;
7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
8 import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
9 import net.sourceforge.pmd.ast.ASTEnumDeclaration;
10 import net.sourceforge.pmd.ast.ASTExplicitConstructorInvocation;
11 import net.sourceforge.pmd.ast.ASTFieldDeclaration;
12 import net.sourceforge.pmd.ast.ASTInitializer;
13 import net.sourceforge.pmd.ast.ASTMethodDeclaration;
14 import net.sourceforge.pmd.ast.ASTTypeDeclaration;
15 import net.sourceforge.pmd.stat.DataPoint;
16 import net.sourceforge.pmd.util.NumericConstants;
17
18 /***
19 * Non-commented source statement counter for type declarations.
20 *
21 * @author Jason Bennett
22 */
23 public class NcssTypeCount extends AbstractNcssCount {
24
25 /***
26 * Count type declarations. This includes classes as well as enums and
27 * annotations.
28 */
29 public NcssTypeCount() {
30 super( ASTTypeDeclaration.class );
31 }
32
33 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
34
35 if ( !node.isNested() ) {
36 return super.visit( node, data );
37 }
38
39 return countNodeChildren( node, data );
40 }
41
42 public Object visit(ASTConstructorDeclaration node, Object data) {
43 return countNodeChildren( node, data );
44 }
45
46 public Object visit(ASTExplicitConstructorInvocation node, Object data) {
47 return NumericConstants.ONE;
48 }
49
50 public Object visit(ASTEnumDeclaration node, Object data) {
51
52
53
54
55 if ( node.jjtGetParent() instanceof ASTTypeDeclaration ) {
56 Integer nodeCount = countNodeChildren( node, data );
57 int count = nodeCount.intValue() - 1;
58 return new Integer( count );
59 }
60 return countNodeChildren( node, data );
61 }
62
63 public Object visit(ASTMethodDeclaration node, Object data) {
64 return countNodeChildren( node, data );
65 }
66
67 public Object visit(ASTInitializer node, Object data) {
68 return countNodeChildren( node, data );
69 }
70
71 public Object visit(ASTFieldDeclaration node, Object data) {
72 return NumericConstants.ONE;
73 }
74
75 protected void makeViolations(RuleContext ctx, Set p) {
76 Iterator points = p.iterator();
77 while ( points.hasNext() ) {
78 DataPoint point = (DataPoint) points.next();
79 addViolation( ctx, point.getNode(),
80 String.valueOf( (int) point.getScore() ) );
81 }
82 }
83
84 }