/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.rule.strings; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; public class UnnecessaryCaseChangeRule extends AbstractJavaRule { public Object visit(ASTPrimaryExpression exp, Object data) { int n = exp.jjtGetNumChildren(); if (n < 4) { return data; } int first = getBadPrefixOrNull(exp, n); if (first == -1) { return data; } String second = getBadSuffixOrNull(exp, first + 2); if (second == null) { return data; } if (!(exp.jjtGetChild(first + 1) instanceof ASTPrimarySuffix)) { return data; } ASTPrimarySuffix methodCall = (ASTPrimarySuffix) exp.jjtGetChild(first + 1); if (!methodCall.isArguments() || methodCall.getArgumentCount() > 0) { return data; } addViolation(data, exp); return data; } private int getBadPrefixOrNull(ASTPrimaryExpression exp, int childrenCount) { // verify PrimaryPrefix/Name[ends-with(@Image, 'toUpperCase'] for (int i = 0; i < childrenCount - 3; i++) { Node child = exp.jjtGetChild(i); String image; if (child instanceof ASTPrimaryPrefix) { if (child.jjtGetNumChildren() != 1 || !(child.jjtGetChild(0) instanceof ASTName)) { continue; } ASTName name = (ASTName) child.jjtGetChild(0); image = name.getImage(); } else if (child instanceof ASTPrimarySuffix) { image = ((ASTPrimarySuffix) child).getImage(); } else { continue; } if (image == null || !(image.endsWith("toUpperCase") || image.endsWith("toLowerCase"))) { continue; } else { return i; } } return -1; } private String getBadSuffixOrNull(ASTPrimaryExpression exp, int equalsPosition) { // verify PrimarySuffix[@Image='equals'] if (!(exp.jjtGetChild(equalsPosition) instanceof ASTPrimarySuffix)) { return null; } ASTPrimarySuffix suffix = (ASTPrimarySuffix) exp.jjtGetChild(equalsPosition); if (suffix.getImage() == null || !(suffix.hasImageEqualTo("equals") || suffix.hasImageEqualTo("equalsIgnoreCase"))) { return null; } return suffix.getImage(); } }