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.ASTLiteral;
6 import net.sourceforge.pmd.ast.ASTPrimaryExpression;
7 import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
8 import net.sourceforge.pmd.ast.SimpleNode;
9 import net.sourceforge.pmd.symboltable.NameOccurrence;
10
11 import java.util.Iterator;
12 import java.util.List;
13
14 public class UseIndexOfChar extends AbstractRule {
15 public Object visit(ASTVariableDeclaratorId node, Object data) {
16 if (!node.getNameDeclaration().getTypeImage().equals("String")) {
17 return data;
18 }
19 for (Iterator i = node.getUsages().iterator(); i.hasNext();) {
20 NameOccurrence occ = (NameOccurrence) i.next();
21 if (occ.getNameForWhichThisIsAQualifier() != null &&
22 (occ.getNameForWhichThisIsAQualifier().getImage().indexOf("indexOf") != -1 ||
23 occ.getNameForWhichThisIsAQualifier().getImage().indexOf("lastIndexOf") != -1)) {
24 SimpleNode parent = (SimpleNode)occ.getLocation().jjtGetParent().jjtGetParent();
25 if (parent instanceof ASTPrimaryExpression) {
26
27 List additives = parent.findChildrenOfType(ASTAdditiveExpression.class);
28 if (!additives.isEmpty()) {
29 return data;
30 }
31 List literals = parent.findChildrenOfType(ASTLiteral.class);
32 for (Iterator j = literals.iterator(); j.hasNext();) {
33 ASTLiteral literal = (ASTLiteral)j.next();
34 if (literal.getImage().length() == 3 && literal.getImage().charAt(0) == '\"') {
35 addViolation(data, occ.getLocation());
36 }
37 }
38 }
39 }
40 }
41 return data;
42 }
43 }
44