View Javadoc

1   package net.sourceforge.pmd.rules.optimization;
2   
3   import java.util.Set;
4   
5   import net.sourceforge.pmd.AbstractRule;
6   import net.sourceforge.pmd.RuleContext;
7   import net.sourceforge.pmd.SourceType;
8   import net.sourceforge.pmd.ast.ASTName;
9   import net.sourceforge.pmd.ast.ASTPrimaryExpression;
10  import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
11  import net.sourceforge.pmd.ast.ASTPrimarySuffix;
12  import net.sourceforge.pmd.ast.Node;
13  import net.sourceforge.pmd.util.CollectionUtil;
14  
15  public class UnnecessaryWrapperObjectCreation extends AbstractRule {
16  
17      private static final Set prefixSet = 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 suffixSet = CollectionUtil.asSet(new String[] {
28          "byteValue",
29          "shortValue",
30          "intValue",
31          "longValue",
32          "floatValue",
33          "doubleValue",
34          "charValue"
35      });
36  
37      public Object visit(ASTPrimaryPrefix node, Object data) {
38          if (node.jjtGetNumChildren() == 0 || !node.jjtGetChild(0).getClass().equals(ASTName.class)) {
39              return super.visit(node, data);
40          }
41  
42          String image = ((ASTName) node.jjtGetChild(0)).getImage();
43          if (image.startsWith("java.lang.")) {
44              image = image.substring(10);
45          }
46  
47          boolean checkBoolean = ((RuleContext) data).getSourceType().compareTo(SourceType.JAVA_15) >= 0;
48  
49          if (prefixSet.contains(image)||(checkBoolean && "Boolean.valueOf".equals(image))) {
50              ASTPrimaryExpression parent = (ASTPrimaryExpression) node.jjtGetParent();
51              if (parent.jjtGetNumChildren() >= 3) {
52                  Node n = parent.jjtGetChild(2);
53                  if (n instanceof ASTPrimarySuffix) {
54                      ASTPrimarySuffix suffix = (ASTPrimarySuffix) n;
55                      image = suffix.getImage();
56  
57                      if (suffixSet.contains(image)||(checkBoolean && "booleanValue".equals(image))) {
58                          super.addViolation(data, node);
59                          return data;
60                      }
61                  }
62              }
63          }
64          return super.visit(node, data);
65      }
66  
67  }