in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/GeneratedMembersUtil.cs [16:82]
public static IList<ITypeMember> GetGeneratedMembers(this TypePart typePart)
{
if (typePart.TypeElement is not { } typeElement)
return EmptyList<ITypeMember>.Instance;
var result = new LocalList<ITypeMember>(new ITypeMember[]
{
new EqualsStructuralTypeMethod(typeElement),
new EqualsObjectMethod(typeElement),
new EqualsObjectWithComparerMethod(typeElement),
new GetHashCodeMethod(typeElement),
new GetHashCodeWithComparerMethod(typeElement),
});
if (typePart is IFSharpStructuralTypePart simpleTypePart)
{
if (simpleTypePart.OverridesToString)
result.Add(new ToStringMethod(typeElement));
if (simpleTypePart.HasCompareTo)
{
result.Add(new CompareToStructuralTypeMethod(typeElement));
result.Add(new CompareToObjectMethod(typeElement));
result.Add(new CompareToObjectWithComparerMethod(typeElement));
}
}
switch (typePart)
{
case IRecordPart recordPart:
result.Add(new FSharpGeneratedConstructorFromFields(typePart));
if (recordPart.CliMutable && typePart is Class.IClassPart)
result.Add(new DefaultConstructor(typeElement));
break;
case IFSharpExceptionPart exceptionPart:
result.Add(new FSharpGeneratedExceptionDefaultConstructor(typePart));
if (exceptionPart.HasFields)
result.Add(new FSharpGeneratedConstructorFromFields(typePart));
break;
case IUnionPart unionPart:
result.Add(new UnionTagProperty(typeElement));
foreach (var unionCase in unionPart.Cases)
{
if (unionCase.HasFields)
{
result.Add(new FSharpUnionCaseNewMethod(unionCase));
if (!unionPart.HasNestedTypes)
result.AddRange(unionCase.CaseFields);
else if (unionCase.NestedType is { } nestedType)
result.Add(nestedType);
}
if (!unionPart.IsSingleCase)
result.Add(new FSharpUnionCaseIsCaseProperty(unionCase));
}
if (!unionPart.IsSingleCase)
result.Add(new FSharpUnionTagsClass(typeElement));
break;
}
return result.ResultingList();
}