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  import net.sourceforge.pmd.typeresolution.TypeHelper;
    13
    14  import java.util.List;
    15
    16  public class StringInstantiation extends AbstractRule {
    17
    18      public Object visit(ASTAllocationExpression node, Object data) {
    19          if (!(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
    20              return data;
    21          }
    22
    23          if (!TypeHelper.isA((ASTClassOrInterfaceType) node.jjtGetChild(0), String.class)) {
    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 =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 = 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(str);
    50          if (vnd == null || TypeHelper.isA(vnd, String.class)) {
    51              addViolation(data, node);
    52          }
    53          return data;
    54      }
    55  }