private static String getAstubxSignature()

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)
        + ")";
  }