UselessStringValueOfRule.java
01 package net.sourceforge.pmd.lang.java.rule.strings;
02 
03 import net.sourceforge.pmd.lang.ast.Node;
04 import net.sourceforge.pmd.lang.java.ast.ASTAdditiveExpression;
05 import net.sourceforge.pmd.lang.java.ast.ASTLiteral;
06 import net.sourceforge.pmd.lang.java.ast.ASTName;
07 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
08 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
09 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
10 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
11 
12 public class UselessStringValueOfRule extends AbstractJavaRule {
13 
14     @Override
15     public Object visit(ASTPrimaryPrefix node, Object data) {
16         if (node.jjtGetNumChildren() == ||
17             !(node.jjtGetChild(0instanceof ASTName)) {
18             return super.visit(node, data);
19         }
20 
21         String image = ((ASTNamenode.jjtGetChild(0)).getImage();
22 
23         if ("String.valueOf".equals(image)) {
24             Node parent = node.jjtGetParent();
25             if (parent.jjtGetNumChildren() != 2) {
26                 return super.visit(node, data);
27             }
28             Node gp = parent.jjtGetParent();
29             if (parent instanceof ASTPrimaryExpression &&
30                     gp instanceof ASTAdditiveExpression &&
31                     "+".equals(gp.getImage())) {
32                 boolean ok = false;
33                 if (gp.jjtGetChild(0== parent) {
34                     ok = !isPrimitive(gp.jjtGetChild(1));
35                 else  {
36                     for (int i = 0; !ok && gp.jjtGetChild(i!= parent; i++) {
37                         ok = !isPrimitive(gp.jjtGetChild(i));
38                     }
39                 }
40                 if (ok) {
41                     super.addViolation(data, node);
42                     return data;
43                 }
44             }
45         }
46         return super.visit(node, data);
47     }
48 
49     private static boolean isPrimitive(Node parent) {
50         boolean result = false;
51         if (parent instanceof ASTPrimaryExpression && parent.jjtGetNumChildren() == 1) {
52             Node child = parent.jjtGetChild(0);
53             if (child instanceof ASTPrimaryPrefix && child.jjtGetNumChildren() == 1) {
54                 Node gc = child.jjtGetChild(0);
55                 if (gc instanceof ASTName) {
56                     ASTName name = (ASTNamegc;
57                     if (name.getNameDeclaration() instanceof VariableNameDeclaration) {
58                         VariableNameDeclaration nd = (VariableNameDeclarationname.getNameDeclaration();
59                         if (nd.isPrimitiveType()) {
60                             result = true;
61                         }
62                     }
63                 else if (gc instanceof ASTLiteral) {
64                     result = !((ASTLiteralgc).isStringLiteral();
65                 }
66             }
67         }
68         return result;
69     }
70 
71 }