1 package net.sourceforge.pmd.lang.java.rule.strings;
2
3 import java.util.List;
4
5 import net.sourceforge.pmd.lang.java.ast.ASTAdditiveExpression;
6 import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression;
7 import net.sourceforge.pmd.lang.java.ast.ASTArrayDimsAndInits;
8 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
9 import net.sourceforge.pmd.lang.java.ast.ASTExpression;
10 import net.sourceforge.pmd.lang.java.ast.ASTName;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
12 import net.sourceforge.pmd.lang.java.symboltable.NameDeclaration;
13 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
14 import net.sourceforge.pmd.lang.java.typeresolution.TypeHelper;
15
16 public class StringInstantiationRule extends AbstractJavaRule {
17
18 @Override
19 public Object visit(ASTAllocationExpression node, Object data) {
20 if (!(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
21 return data;
22 }
23
24 if (!TypeHelper.isA((ASTClassOrInterfaceType) node.jjtGetChild(0), String.class)) {
25 return data;
26 }
27
28 List<ASTExpression> exp = node.findDescendantsOfType(ASTExpression.class);
29 if (exp.size() >= 2) {
30 return data;
31 }
32
33 if (node.hasDecendantOfAnyType(ASTArrayDimsAndInits.class, ASTAdditiveExpression.class)) {
34 return data;
35 }
36
37 ASTName name = node.getFirstDescendantOfType(ASTName.class);
38
39 if (name == null) {
40 addViolation(data, node);
41 return data;
42 }
43
44 NameDeclaration nd = name.getNameDeclaration();
45 if (!(nd instanceof VariableNameDeclaration)) {
46 return data;
47 }
48
49 VariableNameDeclaration vnd = (VariableNameDeclaration) nd;
50 if (TypeHelper.isA(vnd, String.class)) {
51 addViolation(data, node);
52 }
53 return data;
54 }
55 }