Program: 54791
Project: 54791
Buggy source:
/** 
 * Generates the client's asynchronous proxy method.
 */
private void generateProxyMethod(SourceWriter w,SerializableTypeOracle serializableTypeOracle,JMethod syncMethod,JMethod asyncMethod){
  w.println();
  JType asyncReturnType=asyncMethod.getReturnType();
  w.print("String_Node_Str");
  w.print(asyncReturnType.getQualifiedSourceName());
  w.print("String_Node_Str");
  w.print(asyncMethod.getName() + "String_Node_Str");
  boolean needsComma=false;
  boolean needsTryCatchBlock=false;
  NameFactory nameFactory=new NameFactory();
  JParameter[] asyncParams=asyncMethod.getParameters();
  for (int i=0; i < asyncParams.length; ++i) {
    JParameter param=asyncParams[i];
    if (needsComma) {
      w.print("String_Node_Str");
    }
 else {
      needsComma=true;
    }
    JType paramType=param.getType();
    if (i < asyncParams.length - 1 && paramType.isPrimitive() == null && !paramType.getQualifiedSourceName().equals(String.class.getCanonicalName())) {
      needsTryCatchBlock=true;
    }
    w.print(paramType.getParameterizedQualifiedSourceName());
    w.print("String_Node_Str");
    String paramName=param.getName();
    nameFactory.addName(paramName);
    w.print(paramName);
  }
  w.println("String_Node_Str");
  w.indent();
  String requestIdName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + requestIdName + "String_Node_Str");
  String statsMethodExpr=getProxySimpleName() + "String_Node_Str" + syncMethod.getName()+ "String_Node_Str";
  String tossName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + tossName + "String_Node_Str"+ statsMethodExpr+ "String_Node_Str"+ getProxySimpleName()+ "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str");
  w.print(ClientSerializationStreamWriter.class.getSimpleName());
  w.print("String_Node_Str");
  String streamWriterName=nameFactory.createName("String_Node_Str");
  w.println(streamWriterName + "String_Node_Str");
  w.println("String_Node_Str");
  w.println(streamWriterName + "String_Node_Str");
  if (needsTryCatchBlock) {
    w.println("String_Node_Str");
    w.indent();
  }
  if (!shouldEnforceTypeVersioning()) {
    w.println(streamWriterName + "String_Node_Str" + ClientSerializationStreamReader.class.getName()+ "String_Node_Str");
  }
  w.println(streamWriterName + "String_Node_Str" + syncMethod.getName()+ "String_Node_Str");
  JParameter[] syncParams=syncMethod.getParameters();
  w.println(streamWriterName + "String_Node_Str" + syncParams.length+ "String_Node_Str");
  for (  JParameter param : syncParams) {
    w.println(streamWriterName + "String_Node_Str" + serializableTypeOracle.getSerializedTypeName(param.getType())+ "String_Node_Str");
  }
  for (int i=0; i < asyncParams.length - 1; ++i) {
    JParameter asyncParam=asyncParams[i];
    w.print(streamWriterName + "String_Node_Str");
    w.print(Shared.getStreamWriteMethodNameFor(asyncParam.getType()));
    w.println("String_Node_Str" + asyncParam.getName() + "String_Node_Str");
  }
  JParameter callbackParam=asyncParams[asyncParams.length - 1];
  String callbackName=callbackParam.getName();
  if (needsTryCatchBlock) {
    w.outdent();
    w.print("String_Node_Str");
    String exceptionName=nameFactory.createName("String_Node_Str");
    w.println(exceptionName + "String_Node_Str");
    w.indent();
    w.println(callbackName + "String_Node_Str" + exceptionName+ "String_Node_Str");
    w.outdent();
    w.println("String_Node_Str");
  }
  w.println();
  String payloadName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + payloadName + "String_Node_Str"+ streamWriterName+ "String_Node_Str");
  w.println(tossName + "String_Node_Str" + statsMethodExpr+ "String_Node_Str"+ getProxySimpleName()+ "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str");
  if (asyncReturnType == JPrimitiveType.VOID) {
    w.print("String_Node_Str");
  }
 else   if (asyncReturnType.getQualifiedSourceName().equals(RequestBuilder.class.getName())) {
    w.print("String_Node_Str");
  }
 else   if (asyncReturnType.getQualifiedSourceName().equals(Request.class.getName())) {
    w.print("String_Node_Str");
  }
 else {
    throw new RuntimeException("String_Node_Str" + asyncReturnType.getQualifiedSourceName());
  }
  JType returnType=syncMethod.getReturnType();
  w.print("String_Node_Str" + getResponseReaderFor(returnType).name());
  w.println("String_Node_Str" + getProxySimpleName() + "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str"+ payloadName+ "String_Node_Str"+ callbackName+ "String_Node_Str");
  w.outdent();
  w.println("String_Node_Str");
}

Fixed version (ground truth):
/** 
 * Generates the client's asynchronous proxy method.
 */
private void generateProxyMethod(SourceWriter w,SerializableTypeOracle serializableTypeOracle,JMethod syncMethod,JMethod asyncMethod){
  w.println();
  JType asyncReturnType=asyncMethod.getReturnType().getErasedType();
  w.print("String_Node_Str");
  w.print(asyncReturnType.getQualifiedSourceName());
  w.print("String_Node_Str");
  w.print(asyncMethod.getName() + "String_Node_Str");
  boolean needsComma=false;
  boolean needsTryCatchBlock=false;
  NameFactory nameFactory=new NameFactory();
  JParameter[] asyncParams=asyncMethod.getParameters();
  for (int i=0; i < asyncParams.length; ++i) {
    JParameter param=asyncParams[i];
    if (needsComma) {
      w.print("String_Node_Str");
    }
 else {
      needsComma=true;
    }
    JType paramType=param.getType();
    paramType=paramType.getErasedType();
    if (i < asyncParams.length - 1 && paramType.isPrimitive() == null && !paramType.getQualifiedSourceName().equals(String.class.getCanonicalName())) {
      needsTryCatchBlock=true;
    }
    w.print(paramType.getQualifiedSourceName());
    w.print("String_Node_Str");
    String paramName=param.getName();
    nameFactory.addName(paramName);
    w.print(paramName);
  }
  w.println("String_Node_Str");
  w.indent();
  String requestIdName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + requestIdName + "String_Node_Str");
  String statsMethodExpr=getProxySimpleName() + "String_Node_Str" + syncMethod.getName()+ "String_Node_Str";
  String tossName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + tossName + "String_Node_Str"+ statsMethodExpr+ "String_Node_Str"+ getProxySimpleName()+ "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str");
  w.print(ClientSerializationStreamWriter.class.getSimpleName());
  w.print("String_Node_Str");
  String streamWriterName=nameFactory.createName("String_Node_Str");
  w.println(streamWriterName + "String_Node_Str");
  w.println("String_Node_Str");
  w.println(streamWriterName + "String_Node_Str");
  if (needsTryCatchBlock) {
    w.println("String_Node_Str");
    w.indent();
  }
  if (!shouldEnforceTypeVersioning()) {
    w.println(streamWriterName + "String_Node_Str" + ClientSerializationStreamReader.class.getName()+ "String_Node_Str");
  }
  w.println(streamWriterName + "String_Node_Str" + syncMethod.getName()+ "String_Node_Str");
  JParameter[] syncParams=syncMethod.getParameters();
  w.println(streamWriterName + "String_Node_Str" + syncParams.length+ "String_Node_Str");
  for (  JParameter param : syncParams) {
    w.println(streamWriterName + "String_Node_Str" + serializableTypeOracle.getSerializedTypeName(param.getType().getErasedType())+ "String_Node_Str");
  }
  for (int i=0; i < asyncParams.length - 1; ++i) {
    JParameter asyncParam=asyncParams[i];
    w.print(streamWriterName + "String_Node_Str");
    w.print(Shared.getStreamWriteMethodNameFor(asyncParam.getType()));
    w.println("String_Node_Str" + asyncParam.getName() + "String_Node_Str");
  }
  JParameter callbackParam=asyncParams[asyncParams.length - 1];
  String callbackName=callbackParam.getName();
  if (needsTryCatchBlock) {
    w.outdent();
    w.print("String_Node_Str");
    String exceptionName=nameFactory.createName("String_Node_Str");
    w.println(exceptionName + "String_Node_Str");
    w.indent();
    w.println(callbackName + "String_Node_Str" + exceptionName+ "String_Node_Str");
    w.outdent();
    w.println("String_Node_Str");
  }
  w.println();
  String payloadName=nameFactory.createName("String_Node_Str");
  w.println("String_Node_Str" + payloadName + "String_Node_Str"+ streamWriterName+ "String_Node_Str");
  w.println(tossName + "String_Node_Str" + statsMethodExpr+ "String_Node_Str"+ getProxySimpleName()+ "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str");
  if (asyncReturnType == JPrimitiveType.VOID) {
    w.print("String_Node_Str");
  }
 else   if (asyncReturnType.getQualifiedSourceName().equals(RequestBuilder.class.getName())) {
    w.print("String_Node_Str");
  }
 else   if (asyncReturnType.getQualifiedSourceName().equals(Request.class.getName())) {
    w.print("String_Node_Str");
  }
 else {
    throw new RuntimeException("String_Node_Str" + asyncReturnType.getQualifiedSourceName());
  }
  JType returnType=syncMethod.getReturnType();
  w.print("String_Node_Str" + getResponseReaderFor(returnType).name());
  w.println("String_Node_Str" + getProxySimpleName() + "String_Node_Str"+ syncMethod.getName()+ "String_Node_Str"+ payloadName+ "String_Node_Str"+ callbackName+ "String_Node_Str");
  w.outdent();
  w.println("String_Node_Str");
}