View Javadoc

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 java.util.Set;
7   
8   import net.sourceforge.pmd.AbstractRule;
9   import net.sourceforge.pmd.Rule;
10  import net.sourceforge.pmd.ast.ASTAllocationExpression;
11  import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
12  import net.sourceforge.pmd.ast.ASTPrimaryExpression;
13  import net.sourceforge.pmd.ast.ASTPrimarySuffix;
14  import net.sourceforge.pmd.ast.SimpleNode;
15  import net.sourceforge.pmd.util.CollectionUtil;
16  
17  public class UnnecessaryConversionTemporary extends AbstractRule implements Rule {
18  
19      private boolean inPrimaryExpressionContext;
20      private ASTPrimaryExpression primary;
21      private boolean usingPrimitiveWrapperAllocation;
22      
23      private static final Set primitiveWrappers = CollectionUtil.asSet(
24      	new String[] {"Integer", "Boolean", "Double", "Long", "Short", "Byte", "Float"}
25      	);
26   
27      public UnnecessaryConversionTemporary() {
28      }
29  
30      public Object visit(ASTPrimaryExpression node, Object data) {
31          if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0 || !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
32              return super.visit(node, data);
33          }
34          // TODO... hmmm... is this inPrimaryExpressionContext gibberish necessary?
35          inPrimaryExpressionContext = true;
36          primary = node;
37          super.visit(node, data);
38          inPrimaryExpressionContext = false;
39          usingPrimitiveWrapperAllocation = false;
40          return data;
41      }
42  
43      public Object visit(ASTAllocationExpression node, Object data) {
44          if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
45              return super.visit(node, data);
46          }
47          if (!primitiveWrappers.contains(((SimpleNode) node.jjtGetChild(0)).getImage())) {
48              return super.visit(node, data);
49          }
50          usingPrimitiveWrapperAllocation = true;
51          return super.visit(node, data);
52      }
53  
54      public Object visit(ASTPrimarySuffix node, Object data) {
55          if (inPrimaryExpressionContext && usingPrimitiveWrapperAllocation) {
56              if (node.hasImageEqualTo("toString")) {
57                  if (node.jjtGetParent() == primary) {
58                      addViolation(data, node);
59                  }
60              }
61          }
62          return super.visit(node, data);
63      }
64  
65  }