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.RuleContext;
9 import net.sourceforge.pmd.ast.ASTAllocationExpression;
10 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
11 import net.sourceforge.pmd.ast.ASTPrimaryExpression;
12 import net.sourceforge.pmd.ast.ASTPrimarySuffix;
13 import net.sourceforge.pmd.ast.SimpleNode;
14
15 import java.util.HashSet;
16 import java.util.Set;
17
18 public class UnnecessaryConversionTemporary extends AbstractRule implements Rule {
19
20 private boolean inPrimaryExpressionContext;
21 private boolean usingPrimitiveWrapperAllocation;
22 private Set primitiveWrappers = new HashSet();
23
24 public UnnecessaryConversionTemporary() {
25 primitiveWrappers.add("Integer");
26 primitiveWrappers.add("Boolean");
27 primitiveWrappers.add("Double");
28 primitiveWrappers.add("Long");
29 primitiveWrappers.add("Short");
30 primitiveWrappers.add("Byte");
31 primitiveWrappers.add("Float");
32 }
33
34 public Object visit(ASTPrimaryExpression node, Object data) {
35 if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0 || !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
36 return super.visit(node, data);
37 }
38
39 inPrimaryExpressionContext = true;
40 super.visit(node, data);
41 inPrimaryExpressionContext = false;
42 usingPrimitiveWrapperAllocation = false;
43 return data;
44 }
45
46 public Object visit(ASTAllocationExpression node, Object data) {
47 if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
48 return super.visit(node, data);
49 }
50 if (!primitiveWrappers.contains(((SimpleNode) node.jjtGetChild(0)).getImage())) {
51 return super.visit(node, data);
52 }
53 usingPrimitiveWrapperAllocation = true;
54 return super.visit(node, data);
55 }
56
57 public Object visit(ASTPrimarySuffix node, Object data) {
58 if (!inPrimaryExpressionContext || !usingPrimitiveWrapperAllocation) {
59 return super.visit(node, data);
60 }
61 if (node.getImage() != null && node.getImage().equals("toString")) {
62 RuleContext ctx = (RuleContext) data;
63 ctx.getReport().addRuleViolation(createRuleViolation(ctx, node));
64 }
65 return super.visit(node, data);
66 }
67
68 }