1 package net.sourceforge.pmd.rules.strings;
2
3 import net.sourceforge.pmd.AbstractRule;
4 import net.sourceforge.pmd.ast.ASTName;
5 import net.sourceforge.pmd.ast.ASTPrimaryExpression;
6 import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
7 import net.sourceforge.pmd.ast.ASTPrimarySuffix;
8
9 public class UnnecessaryCaseChange extends AbstractRule {
10
11 public Object visit(ASTPrimaryExpression exp, Object data) {
12 if (exp.jjtGetNumChildren() < 4) {
13 return data;
14 }
15
16 String first = getBadPrefixOrNull(exp);
17 if (first == null) {
18 return data;
19 }
20
21 String second = getBadSuffixOrNull(exp);
22 if (second == null) {
23 return data;
24 }
25
26 if (!(exp.jjtGetChild(1) instanceof ASTPrimarySuffix)) {
27 return data;
28 }
29 ASTPrimarySuffix methodCall = (ASTPrimarySuffix)exp.jjtGetChild(1);
30 if (!methodCall.isArguments() || methodCall.getArgumentCount() > 0) {
31 return data;
32 }
33
34 addViolation(data, exp);
35 return data;
36 }
37
38 private String getBadPrefixOrNull(ASTPrimaryExpression exp) {
39
40 if (!(exp.jjtGetChild(0) instanceof ASTPrimaryPrefix)) {
41 return null;
42 }
43
44 ASTPrimaryPrefix prefix = (ASTPrimaryPrefix) exp.jjtGetChild(0);
45 if (prefix.jjtGetNumChildren() != 1 || !(prefix.jjtGetChild(0) instanceof ASTName)) {
46 return null;
47 }
48
49 ASTName name = (ASTName) prefix.jjtGetChild(0);
50 if (name.getImage() == null || !(name.getImage().endsWith("toUpperCase") || name.getImage().endsWith("toLowerCase"))) {
51 return null;
52 }
53 return name.getImage();
54 }
55
56 private String getBadSuffixOrNull(ASTPrimaryExpression exp) {
57
58 if (!(exp.jjtGetChild(2) instanceof ASTPrimarySuffix)) {
59 return null;
60 }
61
62 ASTPrimarySuffix suffix = (ASTPrimarySuffix) exp.jjtGetChild(2);
63 if (suffix.getImage() == null || !(suffix.getImage().equals("equals") || suffix.getImage().equals("equalsIgnoreCase"))) {
64 return null;
65 }
66 return suffix.getImage();
67 }
68
69 }