1 package net.sourceforge.pmd.rules.basic; 2 3 import java.math.BigDecimal; 4 import java.math.BigInteger; 5 6 import net.sourceforge.pmd.AbstractRule; 7 import net.sourceforge.pmd.RuleContext; 8 import net.sourceforge.pmd.SourceType; 9 import net.sourceforge.pmd.ast.ASTAllocationExpression; 10 import net.sourceforge.pmd.ast.ASTArguments; 11 import net.sourceforge.pmd.ast.ASTArrayDimsAndInits; 12 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType; 13 import net.sourceforge.pmd.ast.ASTLiteral; 14 import net.sourceforge.pmd.ast.Node; 15 import net.sourceforge.pmd.typeresolution.TypeHelper; 16 17 public class BigIntegerInstantiation extends AbstractRule { 18 19 public Object visit(ASTAllocationExpression node, Object data) { 20 Node type = node.jjtGetChild(0); 21 22 if (!(type instanceof ASTClassOrInterfaceType)) { 23 return super.visit(node, data); 24 } 25 26 boolean jdk15 = ((RuleContext) data).getSourceType().compareTo(SourceType.JAVA_15) >= 0; 27 if ((TypeHelper.isA((ASTClassOrInterfaceType) type, BigInteger.class) || (jdk15 && TypeHelper.isA((ASTClassOrInterfaceType) type, BigDecimal.class))) && 28 (node.getFirstChildOfType(ASTArrayDimsAndInits.class) == null) 29 ) { 30 ASTArguments args = node.getFirstChildOfType(ASTArguments.class); 31 if (args.getArgumentCount() == 1) { 32 ASTLiteral literal = node.getFirstChildOfType(ASTLiteral.class); 33 if (literal == null || literal.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() != args) { 34 return super.visit(node, data); 35 } 36 37 String img = literal.getImage(); 38 if ((img.length() > 2 && img.charAt(0) == '"')) { 39 img = img.substring(1, img.length() - 1); 40 } 41 42 if ("0".equals(img) || "1".equals(img) || (jdk15 && "10".equals(img))) { 43 addViolation(data, node); 44 return data; 45 } 46 } 47 } 48 return super.visit(node, data); 49 } 50 51 }