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.ASTAllocationExpression;
6 import net.sourceforge.pmd.ast.ASTArrayDimsAndInits;
7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
8 import net.sourceforge.pmd.ast.ASTExpression;
9 import net.sourceforge.pmd.ast.ASTName;
10 import net.sourceforge.pmd.symboltable.NameDeclaration;
11 import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
12
13 import java.util.List;
14
15 public class StringInstantiation extends AbstractRule {
16
17 public Object visit(ASTAllocationExpression node, Object data) {
18 if (!(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
19 return data;
20 }
21
22 ASTClassOrInterfaceType clz = (ASTClassOrInterfaceType) node.jjtGetChild(0);
23 if (!clz.getImage().equals("String")) {
24 return data;
25 }
26
27 List exp = node.findChildrenOfType(ASTExpression.class);
28 if (exp.size() >= 2) {
29 return data;
30 }
31
32 if (node.getFirstChildOfType(ASTArrayDimsAndInits.class) != null || node.getFirstChildOfType(ASTAdditiveExpression.class) != null) {
33 return data;
34 }
35
36 ASTName name = (ASTName) node.getFirstChildOfType(ASTName.class);
37
38 if (name == null) {
39 addViolation(data, node);
40 return data;
41 }
42
43 NameDeclaration nd = (NameDeclaration) name.getNameDeclaration();
44 if (!(nd instanceof VariableNameDeclaration)) {
45 return data;
46 }
47
48 VariableNameDeclaration vnd = (VariableNameDeclaration) nd;
49
50 if (vnd == null || vnd.getTypeImage().equals("String")) {
51 addViolation(data, node);
52
53 }
54 return data;
55 }
56 }