/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.dcd.graph;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import org.objectweb.asm.signature.SignatureReader;
import net.sourceforge.pmd.dcd.ClassLoaderUtil;
import net.sourceforge.pmd.dcd.asm.TypeSignatureVisitor;
/**
* Represents a Class Method in a UsageGraph.
*/
@SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
public class MethodNode extends MemberNode<MethodNode, Method> {
private WeakReference<Method> methodReference;
public MethodNode(ClassNode classNode, String name, String desc) {
super(classNode, name, desc);
// getMember();
}
@Override
public Method getMember() {
Method method = methodReference == null ? null : methodReference.get();
if (method == null) {
SignatureReader signatureReader = new SignatureReader(desc);
TypeSignatureVisitor visitor = new TypeSignatureVisitor();
signatureReader.accept(visitor);
method = ClassLoaderUtil.getMethod(super.getClassNode().getType(), name, visitor.getMethodParameterTypes());
methodReference = new WeakReference<>(method);
}
return method;
}
@Override
public int compareTo(MethodNode that) {
// Order by method name
int cmp = this.getName().compareTo(that.getName());
if (cmp == 0) {
// Order by parameter list length
cmp = this.getMember().getParameterTypes().length - that.getMember().getParameterTypes().length;
if (cmp == 0) {
// Order by parameter class name
for (int i = 0; i < this.getMember().getParameterTypes().length; i++) {
cmp = this.getMember().getParameterTypes()[i].getName()
.compareTo(that.getMember().getParameterTypes()[i].getName());
if (cmp != 0) {
break;
}
}
}
}
return cmp;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof MethodNode) {
MethodNode that = (MethodNode) obj;
return super.equals(that);
}
return false;
}
/* (non-Javadoc)
* @see net.sourceforge.pmd.dcd.graph.MemberNode#hashCode()
*/
@Override
public int hashCode() {
return super.hashCode();
}
}