in jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java [514:561]
private static String getAstubxSignature(IMethod mtd) {
Preconditions.checkArgument(
mtd instanceof ShrikeCTMethod, "Method is not a ShrikeCTMethod from bytecodes");
String classType = getSourceLevelQualifiedTypeName(mtd.getDeclaringClass().getReference());
MethodTypeSignature genericSignature = null;
try {
genericSignature = ((ShrikeCTMethod) mtd).getMethodTypeSignature();
} catch (InvalidClassFileException e) {
// don't fail, just proceed without the generic signature
LOG(DEBUG, "DEBUG", "Invalid class file exception: " + e.getMessage());
}
String returnType;
int numParams = mtd.isStatic() ? mtd.getNumberOfParameters() : mtd.getNumberOfParameters() - 1;
String[] argTypes = new String[numParams];
if (genericSignature != null) {
// get types that include generic type arguments
returnType = getSourceLevelQualifiedTypeName(genericSignature.getReturnType().toString());
TypeSignature[] argTypeSigs = genericSignature.getArguments();
Verify.verify(
argTypeSigs.length == numParams,
"Mismatch in number of parameters in generic signature: %s with %s vs %s with %s",
mtd.getSignature(),
numParams,
genericSignature,
argTypeSigs.length);
for (int i = 0; i < argTypeSigs.length; i++) {
argTypes[i] = getSourceLevelQualifiedTypeName(argTypeSigs[i].toString());
}
} else { // no generics
returnType = mtd.isInit() ? null : getSourceLevelQualifiedTypeName(mtd.getReturnType());
int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter
for (int i = 0; i < numParams; i++) {
argTypes[i] = getSourceLevelQualifiedTypeName(mtd.getParameterType(argi++));
}
}
String methodName = mtd.getName().toString();
if (methodName.equals("<init>")) {
// use simple name of enclosing class
methodName = classType.substring(classType.lastIndexOf('.') + 1);
}
return classType
+ ":"
+ (returnType == null ? "void " : returnType + " ")
+ methodName
+ "("
+ String.join(", ", argTypes)
+ ")";
}