View Javadoc

1   package net.sourceforge.pmd.rules.strings;
2   
3   import net.sourceforge.pmd.AbstractRule;
4   import net.sourceforge.pmd.ast.ASTAdditiveExpression;
5   import net.sourceforge.pmd.ast.ASTName;
6   import net.sourceforge.pmd.ast.ASTPrimaryExpression;
7   import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
8   import net.sourceforge.pmd.ast.Node;
9   import net.sourceforge.pmd.ast.SimpleJavaNode;
10  import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
11  
12  public class UselessStringValueOf extends AbstractRule {
13  
14      public Object visit(ASTPrimaryPrefix node, Object data) {
15          if (node.jjtGetNumChildren() == 0 ||
16              !(node.jjtGetChild(0) instanceof ASTName)) {
17              return super.visit(node, data);
18          }
19  
20          String image = ((ASTName) node.jjtGetChild(0)).getImage();
21  
22          if ("String.valueOf".equals(image)) {
23              Node parent = node.jjtGetParent();
24              if (parent.jjtGetNumChildren() != 2) {
25                  return super.visit(node, data);
26              }
27              SimpleJavaNode gp = (SimpleJavaNode) parent.jjtGetParent();
28              if (parent instanceof ASTPrimaryExpression &&
29                      gp instanceof ASTAdditiveExpression &&
30                      "+".equals(gp.getImage())) {
31                  boolean ok = false;
32                  if (gp.jjtGetChild(0) == parent) {
33                      ok = !isPrimitive(gp.jjtGetChild(1));
34                  } else  {
35                      for (int i = 0; !ok && gp.jjtGetChild(i) != parent; i++) {
36                          ok = !isPrimitive(gp.jjtGetChild(i));
37                      }
38                  }
39                  if (ok) {
40                      super.addViolation(data, node);
41                      return data;
42                  }
43              }
44          }
45          return super.visit(node, data);
46      }
47  
48      private static boolean isPrimitive(Node parent) {
49          boolean result = false;
50          if (parent instanceof ASTPrimaryExpression &&
51              parent.jjtGetNumChildren() == 1 &&
52              parent.jjtGetChild(0) instanceof ASTPrimaryPrefix &&
53              parent.jjtGetChild(0).jjtGetNumChildren() == 1 &&
54              parent.jjtGetChild(0).jjtGetChild(0) instanceof ASTName) {
55              ASTName name = (ASTName) parent.jjtGetChild(0).jjtGetChild(0);
56              if (name.getNameDeclaration() instanceof VariableNameDeclaration) {
57                  VariableNameDeclaration nd = (VariableNameDeclaration) name.getNameDeclaration();
58                  if (nd.isPrimitiveType()) {
59                      result = true;
60                  }
61              }
62          }
63          return result;
64      }
65      
66  }