View Javadoc

1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.lang.java.rule.unnecessary;
5   
6   import java.util.Set;
7   
8   import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression;
9   import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
10  import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
11  import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
12  import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
13  import net.sourceforge.pmd.util.CollectionUtil;
14  
15  public class UnnecessaryConversionTemporaryRule extends AbstractJavaRule {
16  
17      private boolean inPrimaryExpressionContext;
18      private ASTPrimaryExpression primary;
19      private boolean usingPrimitiveWrapperAllocation;
20      
21      private static final Set<String> PRIMITIVE_WRAPPERS = CollectionUtil.asSet(
22      	new String[] {"Integer", "Boolean", "Double", "Long", "Short", "Byte", "Float"}
23      	);
24  
25      public Object visit(ASTPrimaryExpression node, Object data) {
26          if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0 || !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
27              return super.visit(node, data);
28          }
29          // TODO... hmmm... is this inPrimaryExpressionContext gibberish necessary?
30          inPrimaryExpressionContext = true;
31          primary = node;
32          super.visit(node, data);
33          inPrimaryExpressionContext = false;
34          usingPrimitiveWrapperAllocation = false;
35          return data;
36      }
37  
38      public Object visit(ASTAllocationExpression node, Object data) {
39          if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
40              return super.visit(node, data);
41          }
42          if (!PRIMITIVE_WRAPPERS.contains(node.jjtGetChild(0).getImage())) {
43              return super.visit(node, data);
44          }
45          usingPrimitiveWrapperAllocation = true;
46          return super.visit(node, data);
47      }
48  
49      public Object visit(ASTPrimarySuffix node, Object data) {
50          if (inPrimaryExpressionContext && usingPrimitiveWrapperAllocation) {
51              if (node.hasImageEqualTo("toString")) {
52                  if (node.jjtGetParent() == primary) {
53                      addViolation(data, node);
54                  }
55              }
56          }
57          return super.visit(node, data);
58      }
59  
60  }