public static IList GetGeneratedMembers()

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();
    }