package org.robolectric.internal.bytecode; import org.objectweb.asm.Type; import org.robolectric.util.Join; public class MethodSignature { public final String className; public final String methodName; public final String[] paramTypes; public final String returnType; private MethodSignature(String className, String methodName, String[] paramTypes, String returnType) { this.className = className; this.methodName = methodName; this.paramTypes = paramTypes; this.returnType = returnType; } public static MethodSignature parse(String internalString) { int parenStart = internalString.indexOf('('); int methodStart = internalString.lastIndexOf('/', parenStart); String className = internalString.substring(0, methodStart).replace('/', '.'); String methodName = internalString.substring(methodStart + 1, parenStart); String methodDescriptor = internalString.substring(parenStart); Type[] argumentTypes = Type.getArgumentTypes(methodDescriptor); String[] paramTypes = new String[argumentTypes.length]; for (int i = 0; i < argumentTypes.length; i++) { paramTypes[i] = argumentTypes[i].getClassName(); } final String returnType = Type.getReturnType(methodDescriptor).getClassName(); return new MethodSignature(className, methodName, paramTypes, returnType); } @Override public String toString() { return className + "." + methodName + "(" + Join.join(", ", (Object[]) paramTypes) + ")"; } boolean matches(String className, String methodName) { return this.className.equals(className) && this.methodName.equals(methodName); } }