BigIntegerInstantiationRule.java
01 package net.sourceforge.pmd.lang.java.rule.basic;
02 
03 import java.math.BigDecimal;
04 import java.math.BigInteger;
05 
06 import net.sourceforge.pmd.RuleContext;
07 import net.sourceforge.pmd.lang.LanguageVersion;
08 import net.sourceforge.pmd.lang.ast.Node;
09 import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression;
10 import net.sourceforge.pmd.lang.java.ast.ASTArguments;
11 import net.sourceforge.pmd.lang.java.ast.ASTArrayDimsAndInits;
12 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
13 import net.sourceforge.pmd.lang.java.ast.ASTLiteral;
14 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
15 import net.sourceforge.pmd.lang.java.typeresolution.TypeHelper;
16 
17 public class BigIntegerInstantiationRule extends AbstractJavaRule {
18 
19     @Override
20     public Object visit(ASTAllocationExpression node, Object data) {
21         Node type = node.jjtGetChild(0);
22 
23         if (!(type instanceof ASTClassOrInterfaceType)) {
24             return super.visit(node, data);
25         }
26 
27         boolean jdk15 = ((RuleContextdata).getLanguageVersion().compareTo(LanguageVersion.JAVA_15>= 0;
28         if ((TypeHelper.isA((ASTClassOrInterfaceTypetype, BigInteger.class|| jdk15 && TypeHelper.isA((ASTClassOrInterfaceTypetype, BigDecimal.class)) &&
29                 !node.hasDescendantOfType(ASTArrayDimsAndInits.class)
30         ) {
31             ASTArguments args = node.getFirstChildOfType(ASTArguments.class);
32             if (args.getArgumentCount() == 1) {
33                 ASTLiteral literal = node.getFirstDescendantOfType(ASTLiteral.class);
34                 if (literal == null || literal.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() != args) {
35                     return super.visit(node, data);
36                 }
37 
38                 String img = literal.getImage();
39                 if (literal.isStringLiteral()) {
40                     img = img.substring(1, img.length() 1);
41                 }
42 
43                 if ("0".equals(img|| "1".equals(img|| jdk15 && "10".equals(img)) {
44                     addViolation(data, node);
45                     return data;
46                 }
47             }
48         }
49         return super.visit(node, data);
50     }
51 
52 }