1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.Rule;
8 import net.sourceforge.pmd.ast.ASTAllocationExpression;
9 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
10 import net.sourceforge.pmd.ast.ASTPrimaryExpression;
11 import net.sourceforge.pmd.ast.ASTPrimarySuffix;
12 import net.sourceforge.pmd.ast.SimpleNode;
13
14 import java.util.HashSet;
15 import java.util.Set;
16
17 public class UnnecessaryConversionTemporary extends AbstractRule implements Rule {
18
19 private boolean inPrimaryExpressionContext;
20 private boolean usingPrimitiveWrapperAllocation;
21 private Set primitiveWrappers = new HashSet();
22
23 public UnnecessaryConversionTemporary() {
24 primitiveWrappers.add("Integer");
25 primitiveWrappers.add("Boolean");
26 primitiveWrappers.add("Double");
27 primitiveWrappers.add("Long");
28 primitiveWrappers.add("Short");
29 primitiveWrappers.add("Byte");
30 primitiveWrappers.add("Float");
31 }
32
33 public Object visit(ASTPrimaryExpression node, Object data) {
34 if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0 || !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
35 return super.visit(node, data);
36 }
37
38 inPrimaryExpressionContext = true;
39 super.visit(node, data);
40 inPrimaryExpressionContext = false;
41 usingPrimitiveWrapperAllocation = false;
42 return data;
43 }
44
45 public Object visit(ASTAllocationExpression node, Object data) {
46 if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
47 return super.visit(node, data);
48 }
49 if (!primitiveWrappers.contains(((SimpleNode) node.jjtGetChild(0)).getImage())) {
50 return super.visit(node, data);
51 }
52 usingPrimitiveWrapperAllocation = true;
53 return super.visit(node, data);
54 }
55
56 public Object visit(ASTPrimarySuffix node, Object data) {
57 if (!inPrimaryExpressionContext || !usingPrimitiveWrapperAllocation) {
58 return super.visit(node, data);
59 }
60 if (node.getImage() != null && node.getImage().equals("toString")) {
61 addViolation(data, node);
62 }
63 return super.visit(node, data);
64 }
65
66 }