View Javadoc

    1   package net.sourceforge.pmd.rules.strings;
    2
    3   import net.sourceforge.pmd.ast.Node;
    4   import net.sourceforge.pmd.ast.SimpleNode;
    5   import net.sourceforge.pmd.rules.AbstractInefficientZeroCheck;
    6   import net.sourceforge.pmd.symboltable.NameOccurrence;
    7
    8   /**
    9    * This rule finds code which inefficiently determines empty strings. This code
    10   * <p/>
    11   *
    12   * <pre>
    13   *         if(str.trim().length()==0){....
    14   * </pre>
    15   *
    16   * <p/> is quite inefficient as trim() causes a new String to be created.
    17   * Smarter code to check for an empty string would be: <p/>
    18   *
    19   * <pre>
    20   * Character.isWhitespace(str.charAt(i));
    21   * </pre>
    22   *
    23   * @author acaplan
    24   */
    25  public class InefficientEmptyStringCheck extends AbstractInefficientZeroCheck {
    26
    27      /**
    28       * Determine if we're dealing with String.length method
    29       *
    30       * @param occ
    31       *            The name occurance
    32       * @return true if it's String.length, else false
    33       */
    34      public boolean isTargetMethod(NameOccurrence occ) {
    35          if (occ.getNameForWhichThisIsAQualifier() != null
    36                  && occ.getNameForWhichThisIsAQualifier().getImage().indexOf("trim") != -1) {
    37              Node pExpression = occ.getLocation().jjtGetParent().jjtGetParent();
    38              if (pExpression.jjtGetNumChildren() >= 3
    39                      && "length".equals(((SimpleNode) pExpression.jjtGetChild(2)).getImage())) {
    40                  return true;
    41              }
    42          }
    43          return false;
    44      }
    45
    46      public boolean appliesToClassName(String name) {
    47          return "String".equals(name);
    48      }
    49
    50  }