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  }