View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.rules.strings;
5   
6   import net.sourceforge.pmd.AbstractRule;
7   import net.sourceforge.pmd.ast.ASTBlockStatement;
8   import net.sourceforge.pmd.ast.ASTLiteral;
9   
10  import java.util.regex.Pattern;
11  import java.util.regex.Matcher;
12  
13  /***
14   * This rule finds the following:
15   * <p/>
16   * <pre>
17   *         StringBuffer.append(&quot;c&quot;); // appends a
18   *         single character
19   * </pre>
20   * <p/>
21   * It is preferable to use StringBuffer.append('c'); // appends a single
22   * character Implementation of PMD RFE 1373863
23   */
24  public class AppendCharacterWithChar extends AbstractRule {
25  
26      private static final Pattern REGEX = Pattern.compile("\"[////]?[//s//S]\"");
27  
28      public Object visit(ASTLiteral node, Object data) {
29          ASTBlockStatement bs = (ASTBlockStatement) node
30                  .getFirstParentOfType(ASTBlockStatement.class);
31          if (bs == null) {
32              return data;
33          }
34  
35          String str = node.getImage();
36          if (str == null || str.length() < 3 || str.length() > 4) {
37              return data;
38          }
39  
40          Matcher matcher = REGEX.matcher(str);
41          if (matcher.find()) {
42              if (!InefficientStringBuffering.isInStringBufferOperation(node, 8, "append")) {
43                  return data;
44              }
45              addViolation(data, node);
46          }
47          return data;
48      }
49  }