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.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          // Literal, i.e., new String("foo")
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          // nd == null in cases like: return new String("foo");
50          if (vnd == null || vnd.getTypeImage().equals("String")) {
51              addViolation(data, node);
52  
53          }
54          return data;
55      }
56  }