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: [],
},
};
}