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 }