//Tested with BCEL-5.1
//http://jakarta.apache.org/builds/jakarta-bcel/release/v5.1/
package com.puppycrawl.tools.checkstyle.bcel.checks;
import java.util.Iterator;
import java.util.Set;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.Type;
import com.puppycrawl.tools.checkstyle.api.Scope;
import com.puppycrawl.tools.checkstyle.bcel.ReferenceVisitor;
/**
* Checks for fields that hide fields in superclasses
* @author Daniel Grenner
*/
public class HiddenStaticMethodCheck
extends AbstractReferenceCheck
{
/** @see AbstractReferenceCheck */
public void setScope(String aFrom)
{
super.setScope(aFrom);
((ReferenceVisitor) getVisitor()).addFieldScope(
Scope.getInstance(aFrom));
}
/** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */
public void visitObject(Object aJavaClass)
{
final JavaClass javaClass = (JavaClass) aJavaClass;
final String className = javaClass.getClassName();
final JavaClass[] superClasses = javaClass.getSuperClasses();
final Method[] methods = javaClass.getMethods();
// Check all methods
for (int i = 0; i < methods.length; i++) {
final Method method = methods[i];
// Check that the method is a possible match
if (!method.isPrivate() && method.isStatic()) {
// Go through all their superclasses
for (int j = 0; j < superClasses.length; j++) {
final JavaClass superClass = superClasses[j];
final String superClassName = superClass.getClassName();
final Method[] superClassMethods = superClass.getMethods();
// Go through the methods of the superclasses
for (int k = 0; k < superClassMethods.length; k++) {
final Method superClassMethod = superClassMethods[k];
if (superClassMethod.getName().equals(method.getName()) &&
!ignore(className, method)) {
Type[] methodTypes = method.getArgumentTypes();
Type[] superTypes = superClassMethod.
getArgumentTypes();
if (methodTypes.length == superTypes.length) {
boolean match = true;
for (int arg = 0; arg < methodTypes.length; arg++) {
if (!methodTypes[arg].equals(superTypes[arg])) {
match = false;
}
}
// Same method parameters
if (match) {
log(
javaClass,
0,
"hidden.static.method",
new Object[] {method, superClassName});
}
}
}
}
}
}
}
}
/** @see AbstractReferenceCheck */
public boolean ignore(String aClassName, Method aMethod) {
final String methodName = aMethod.getName();
return (/*super.ignore(aClassName, aMethod)
|| */methodName.equals("<init>")
|| methodName.equals("<clinit>")
|| methodName.equals("class$")
|| aMethod.toString().indexOf("[Synthetic]") > -1);
}
}