01 package net.sourceforge.pmd.lang.java.rule.optimizations;
02
03 import java.util.Set;
04
05 import net.sourceforge.pmd.RuleContext;
06 import net.sourceforge.pmd.lang.java.ast.ASTName;
07 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
08 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
09 import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
10 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
11 import net.sourceforge.pmd.lang.LanguageVersion;
12 import net.sourceforge.pmd.lang.ast.Node;
13 import net.sourceforge.pmd.util.CollectionUtil;
14
15 public class UnnecessaryWrapperObjectCreationRule extends AbstractJavaRule {
16
17 private static final Set<String> PREFIX_SET = CollectionUtil.asSet(new String[] {
18 "Byte.valueOf",
19 "Short.valueOf",
20 "Integer.valueOf",
21 "Long.valueOf",
22 "Float.valueOf",
23 "Double.valueOf",
24 "Character.valueOf"
25 });
26
27 private static final Set<String> SUFFIX_SET = CollectionUtil.asSet(new String[] {
28 "toString",
29 "byteValue",
30 "shortValue",
31 "intValue",
32 "longValue",
33 "floatValue",
34 "doubleValue",
35 "charValue"
36 });
37
38 public Object visit(ASTPrimaryPrefix node, Object data) {
39 if (node.jjtGetNumChildren() == 0 || !(node.jjtGetChild(0) instanceof ASTName)) {
40 return super.visit(node, data);
41 }
42
43 String image = ((ASTName) node.jjtGetChild(0)).getImage();
44 if (image.startsWith("java.lang.")) {
45 image = image.substring(10);
46 }
47
48 boolean checkBoolean = ((RuleContext) data).getLanguageVersion().compareTo(LanguageVersion.JAVA_15) >= 0;
49
50 if (PREFIX_SET.contains(image)||(checkBoolean && "Boolean.valueOf".equals(image))) {
51 ASTPrimaryExpression parent = (ASTPrimaryExpression) node.jjtGetParent();
52 if (parent.jjtGetNumChildren() >= 3) {
53 Node n = parent.jjtGetChild(2);
54 if (n instanceof ASTPrimarySuffix) {
55 ASTPrimarySuffix suffix = (ASTPrimarySuffix) n;
56 image = suffix.getImage();
57
58 if (SUFFIX_SET.contains(image)||(checkBoolean && "booleanValue".equals(image))) {
59 super.addViolation(data, node);
60 return data;
61 }
62 }
63 }
64 }
65 return super.visit(node, data);
66 }
67
68 }
|