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() == 0 ||
17 !(node.jjtGetChild(0) instanceof ASTName)) {
18 return super.visit(node, data);
19 }
20
21 String image = ((ASTName) node.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 = (ASTName) gc;
57 if (name.getNameDeclaration() instanceof VariableNameDeclaration) {
58 VariableNameDeclaration nd = (VariableNameDeclaration) name.getNameDeclaration();
59 if (nd.isPrimitiveType()) {
60 result = true;
61 }
62 }
63 } else if (gc instanceof ASTLiteral) {
64 result = !((ASTLiteral) gc).isStringLiteral();
65 }
66 }
67 }
68 return result;
69 }
70
71 }
|