/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.rule.codesize;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTExplicitConstructorInvocation;
import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTInitializer;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTTypeDeclaration;
import net.sourceforge.pmd.stat.DataPoint;
import net.sourceforge.pmd.util.NumericConstants;
/**
* Non-commented source statement counter for type declarations.
*
* @author Jason Bennett
*/
public class NcssTypeCountRule extends AbstractNcssCountRule {
/**
* Count type declarations. This includes classes as well as enums and
* annotations.
*/
public NcssTypeCountRule() {
super(ASTTypeDeclaration.class);
setProperty(MINIMUM_DESCRIPTOR, 1500d);
}
@Override
public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
if (!node.isNested()) {
return super.visit(node, data);
}
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTConstructorDeclaration node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTExplicitConstructorInvocation node, Object data) {
return NumericConstants.ONE;
}
@Override
public Object visit(ASTEnumDeclaration node, Object data) {
/*
* If the enum is a type in and of itself, don't count its declaration
* twice.
*/
if (node.jjtGetParent() instanceof ASTTypeDeclaration) {
Integer nodeCount = countNodeChildren(node, data);
int count = nodeCount.intValue() - 1;
return Integer.valueOf(count);
}
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTMethodDeclaration node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTInitializer node, Object data) {
return countNodeChildren(node, data);
}
@Override
public Object visit(ASTFieldDeclaration node, Object data) {
return NumericConstants.ONE;
}
@Override
public Object[] getViolationParameters(DataPoint point) {
return new String[] { String.valueOf((int) point.getScore()) };
}
}