function isEqualInstanceMethod()

in src/plugins/equality.ts [852:907]


function isEqualInstanceMethod(
  typeName: string,
  generatedTypeEqualityInformation: GeneratedTypeEqualityInformation[],
): ObjC.Method {
  const openingCode: string[] = [
    'if (self == object) {',
    '  return YES;',
    '} else if (object == nil || ![object isKindOfClass:[self class]]) {',
    '  return NO;',
    '}',
    'return',
  ];
  const equalityCheckEqualityValues: TypeEqualityValue[] =
    generatedTypeEqualityInformation.reduce(buildEqualityChecks, []);
  const equalityCheckEqualityValuesSortedByCost: TypeEqualityValue[] =
    equalityCheckEqualityValues
      .concat()
      .sort(compareTypeEqualityValuesByComputationCost);
  const equalityChecks: string[] =
    equalityCheckEqualityValuesSortedByCost.map(selectValue);
  const equalityChecksUpUntilLastOne: string[] = equalityChecks
    .slice(0, equalityChecks.length - 1)
    .map(stringForIncludingEqualityCheckInCode);
  const lastEqualityCheck: string = equalityChecks[equalityChecks.length - 1];
  const code: string[] = openingCode
    .concat(equalityChecksUpUntilLastOne)
    .concat('  ' + lastEqualityCheck + ';');
  return {
    preprocessors: [],
    belongsToProtocol: 'NSObject',
    keywords: [
      {
        name: 'isEqual',
        argument: {
          name: 'object',
          modifiers: [],
          type: {
            name: typeName,
            reference:
              ObjectSpecUtils.typeReferenceForValueTypeWithName(typeName),
          },
        },
      },
    ],
    code: code,
    comments: [],
    compilerAttributes: [],
    returnType: {
      type: {
        name: 'BOOL',
        reference: 'BOOL',
      },
      modifiers: [],
    },
  };
}