Program: 111889
Project: 111889
Buggy source:
private ClassDeclaration classDecl(JavaTypeFactoryImpl.SyntheticRecordType type){
  ClassDeclaration classDeclaration=Expressions.classDecl(Modifier.PUBLIC | Modifier.STATIC,type.getName(),null,Collections.<Type>emptyList(),new ArrayList<MemberDeclaration>());
  for (  Types.RecordField field : type.getRecordFields()) {
    classDeclaration.memberDeclarations.add(Expressions.fieldDecl(Modifier.PUBLIC,Expressions.parameter(field.getType(),field.getName()),null));
  }
  final BlockBuilder blockBuilder=new BlockBuilder();
  final List<ParameterExpression> parameters=new ArrayList<ParameterExpression>();
  final ParameterExpression thisParameter=Expressions.parameter(type,"String_Node_Str");
  for (  Types.RecordField field : type.getRecordFields()) {
    final ParameterExpression parameter=Expressions.parameter(field.getType(),field.getName());
    parameters.add(parameter);
    blockBuilder.add(Expressions.statement(Expressions.assign(Expressions.field(thisParameter,field),parameter)));
  }
  classDeclaration.memberDeclarations.add(Expressions.constructorDecl(Modifier.PUBLIC,type,parameters,blockBuilder.toBlock()));
  final BlockBuilder blockBuilder2=new BlockBuilder();
  final ParameterExpression thatParameter=Expressions.parameter(type,"String_Node_Str");
  final ParameterExpression oParameter=Expressions.parameter(Object.class,"String_Node_Str");
  blockBuilder2.add(Expressions.ifThen(Expressions.equal(thisParameter,oParameter),Expressions.return_(null,Expressions.constant(true))));
  blockBuilder2.add(Expressions.ifThen(Expressions.not(Expressions.typeIs(oParameter,type)),Expressions.return_(null,Expressions.constant(false))));
  blockBuilder2.add(Expressions.declare(Modifier.FINAL,thatParameter,Expressions.convert_(oParameter,type)));
  List<Expression> conditions=new ArrayList<Expression>();
  for (  Types.RecordField field : type.getRecordFields()) {
    conditions.add(Primitive.is(field.getType()) ? Expressions.equal(Expressions.field(thisParameter,field.getName()),Expressions.field(thatParameter,field.getName())) : Expressions.call(Utilities.class,"String_Node_Str",Expressions.field(thisParameter,field.getName()),Expressions.field(thatParameter,field.getName())));
  }
  blockBuilder2.add(Expressions.return_(null,JavaRules.EnumUtil.foldAnd(conditions)));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,boolean.class,"String_Node_Str",Collections.singletonList(oParameter),blockBuilder2.toBlock()));
  final BlockBuilder blockBuilder3=new BlockBuilder();
  final ParameterExpression hParameter=Expressions.parameter(int.class,"String_Node_Str");
  final ConstantExpression constantZero=Expressions.constant(0);
  blockBuilder3.add(Expressions.declare(0,hParameter,constantZero));
  for (  Types.RecordField field : type.getRecordFields()) {
    blockBuilder3.add(Expressions.statement(Expressions.assign(hParameter,Expressions.call(Utilities.class,"String_Node_Str",Arrays.<Expression>asList(hParameter,Expressions.field(thisParameter,field))))));
  }
  blockBuilder3.add(Expressions.return_(null,hParameter));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,int.class,"String_Node_Str",Collections.<ParameterExpression>emptyList(),blockBuilder3.toBlock()));
  final BlockBuilder blockBuilder4=new BlockBuilder();
  final ParameterExpression cParameter=Expressions.parameter(int.class,"String_Node_Str");
  blockBuilder4.add(Expressions.declare(0,cParameter,null));
  final ConditionalStatement conditionalStatement=Expressions.ifThen(Expressions.notEqual(cParameter,constantZero),Expressions.return_(null,cParameter));
  for (  Types.RecordField field : type.getRecordFields()) {
    blockBuilder4.add(Expressions.statement(Expressions.assign(cParameter,Expressions.call(Utilities.class,field.nullable() ? "String_Node_Str" : "String_Node_Str",Expressions.field(thisParameter,field),Expressions.field(thatParameter,field)))));
    blockBuilder4.add(conditionalStatement);
  }
  blockBuilder4.add(Expressions.return_(null,constantZero));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,int.class,"String_Node_Str",Collections.singletonList(thatParameter),blockBuilder4.toBlock()));
  final BlockBuilder blockBuilder5=new BlockBuilder();
  Expression expression5=null;
  for (  Types.RecordField field : type.getRecordFields()) {
    if (expression5 == null) {
      expression5=Expressions.constant("String_Node_Str" + field.getName() + "String_Node_Str");
    }
 else {
      expression5=Expressions.add(expression5,Expressions.constant("String_Node_Str" + field.getName() + "String_Node_Str"));
    }
    expression5=Expressions.add(expression5,Expressions.field(thisParameter,field.getName()));
  }
  expression5=expression5 == null ? Expressions.constant("String_Node_Str") : Expressions.add(expression5,Expressions.constant("String_Node_Str"));
  blockBuilder5.add(Expressions.return_(null,expression5));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,String.class,"String_Node_Str",Collections.<ParameterExpression>emptyList(),blockBuilder5.toBlock()));
  return classDeclaration;
}

Fixed version (ground truth):
private ClassDeclaration classDecl(JavaTypeFactoryImpl.SyntheticRecordType type){
  ClassDeclaration classDeclaration=Expressions.classDecl(Modifier.PUBLIC | Modifier.STATIC,type.getName(),null,Collections.<Type>emptyList(),new ArrayList<MemberDeclaration>());
  for (  Types.RecordField field : type.getRecordFields()) {
    classDeclaration.memberDeclarations.add(Expressions.fieldDecl(Modifier.PUBLIC,Expressions.parameter(field.getType(),field.getName()),null));
  }
  final BlockBuilder blockBuilder=new BlockBuilder();
  final List<ParameterExpression> parameters=new ArrayList<ParameterExpression>();
  final ParameterExpression thisParameter=Expressions.parameter(type,"String_Node_Str");
  for (  Types.RecordField field : type.getRecordFields()) {
    final ParameterExpression parameter=Expressions.parameter(field.getType(),field.getName());
    parameters.add(parameter);
    blockBuilder.add(Expressions.statement(Expressions.assign(Expressions.field(thisParameter,field),parameter)));
  }
  classDeclaration.memberDeclarations.add(Expressions.constructorDecl(Modifier.PUBLIC,type,parameters,blockBuilder.toBlock()));
  final BlockBuilder blockBuilder2=new BlockBuilder();
  final ParameterExpression thatParameter=Expressions.parameter(type,"String_Node_Str");
  final ParameterExpression oParameter=Expressions.parameter(Object.class,"String_Node_Str");
  blockBuilder2.add(Expressions.ifThen(Expressions.equal(thisParameter,oParameter),Expressions.return_(null,Expressions.constant(true))));
  blockBuilder2.add(Expressions.ifThen(Expressions.not(Expressions.typeIs(oParameter,type)),Expressions.return_(null,Expressions.constant(false))));
  blockBuilder2.add(Expressions.declare(Modifier.FINAL,thatParameter,Expressions.convert_(oParameter,type)));
  List<Expression> conditions=new ArrayList<Expression>();
  for (  Types.RecordField field : type.getRecordFields()) {
    conditions.add(Primitive.is(field.getType()) ? Expressions.equal(Expressions.field(thisParameter,field.getName()),Expressions.field(thatParameter,field.getName())) : Expressions.call(Utilities.class,"String_Node_Str",Expressions.field(thisParameter,field.getName()),Expressions.field(thatParameter,field.getName())));
  }
  blockBuilder2.add(Expressions.return_(null,Expressions.foldAnd(conditions)));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,boolean.class,"String_Node_Str",Collections.singletonList(oParameter),blockBuilder2.toBlock()));
  final BlockBuilder blockBuilder3=new BlockBuilder();
  final ParameterExpression hParameter=Expressions.parameter(int.class,"String_Node_Str");
  final ConstantExpression constantZero=Expressions.constant(0);
  blockBuilder3.add(Expressions.declare(0,hParameter,constantZero));
  for (  Types.RecordField field : type.getRecordFields()) {
    blockBuilder3.add(Expressions.statement(Expressions.assign(hParameter,Expressions.call(Utilities.class,"String_Node_Str",Arrays.<Expression>asList(hParameter,Expressions.field(thisParameter,field))))));
  }
  blockBuilder3.add(Expressions.return_(null,hParameter));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,int.class,"String_Node_Str",Collections.<ParameterExpression>emptyList(),blockBuilder3.toBlock()));
  final BlockBuilder blockBuilder4=new BlockBuilder();
  final ParameterExpression cParameter=Expressions.parameter(int.class,"String_Node_Str");
  blockBuilder4.add(Expressions.declare(0,cParameter,null));
  final ConditionalStatement conditionalStatement=Expressions.ifThen(Expressions.notEqual(cParameter,constantZero),Expressions.return_(null,cParameter));
  for (  Types.RecordField field : type.getRecordFields()) {
    blockBuilder4.add(Expressions.statement(Expressions.assign(cParameter,Expressions.call(Utilities.class,field.nullable() ? "String_Node_Str" : "String_Node_Str",Expressions.field(thisParameter,field),Expressions.field(thatParameter,field)))));
    blockBuilder4.add(conditionalStatement);
  }
  blockBuilder4.add(Expressions.return_(null,constantZero));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,int.class,"String_Node_Str",Collections.singletonList(thatParameter),blockBuilder4.toBlock()));
  final BlockBuilder blockBuilder5=new BlockBuilder();
  Expression expression5=null;
  for (  Types.RecordField field : type.getRecordFields()) {
    if (expression5 == null) {
      expression5=Expressions.constant("String_Node_Str" + field.getName() + "String_Node_Str");
    }
 else {
      expression5=Expressions.add(expression5,Expressions.constant("String_Node_Str" + field.getName() + "String_Node_Str"));
    }
    expression5=Expressions.add(expression5,Expressions.field(thisParameter,field.getName()));
  }
  expression5=expression5 == null ? Expressions.constant("String_Node_Str") : Expressions.add(expression5,Expressions.constant("String_Node_Str"));
  blockBuilder5.add(Expressions.return_(null,expression5));
  classDeclaration.memberDeclarations.add(Expressions.methodDecl(Modifier.PUBLIC,String.class,"String_Node_Str",Collections.<ParameterExpression>emptyList(),blockBuilder5.toBlock()));
  return classDeclaration;
}