private static MemberPresenceFlag InvestigateMembers()

in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/Cache2/Parts/FSharpClassLikePart.cs [59:129]


    private static MemberPresenceFlag InvestigateMembers([NotNull] T declaration, PartKind partKind)
    {
      MemberPresenceFlag membersMask = 0;

      var isInterface = partKind == PartKind.Interface;
      var isStruct = partKind == PartKind.Struct;

      foreach (var decl in declaration.MemberDeclarations)
      {
        var compiledName = decl.DeclaredName;
        if (compiledName.StartsWith("op_", StringComparison.Ordinal))
        {
          switch (compiledName)
          {
            case StandardOperatorNames.Explicit:
              membersMask |= MemberPresenceFlag.EXPLICIT_OP;
              break;
            case StandardOperatorNames.Implicit:
              membersMask |= MemberPresenceFlag.IMPLICIT_OP;
              break;
            default:
              membersMask |= MemberPresenceFlag.SIGN_OR_EQUALITY_OP;
              break;
          }
        }

        if (decl is IOverridableMemberDeclaration overridableDecl)
        {
          if (compiledName == "Equals" && overridableDecl.IsOverride && 
              overridableDecl.GetAccessRights() == AccessRights.PUBLIC)
          {
            membersMask |= MemberPresenceFlag.MAY_EQUALS_OVERRIDE;
          }

          if (isInterface && overridableDecl.IsStatic && overridableDecl.IsAbstract)
            membersMask |= MemberPresenceFlag.HAS_STATIC_ABSTRACT_MEMBERS;
        }

        if (decl is IConstructorSignatureOrDeclaration constructorDeclOrSig &&
            constructorDeclOrSig.GetAccessRights() == AccessRights.PUBLIC)
        {
          if (!isStruct)
            membersMask |= MemberPresenceFlag.INSTANCE_CTOR;

          if (constructorDeclOrSig is IConstructorDeclaration constructorDecl)
          {
            if (constructorDecl.ParameterPatterns.IgnoreInnerParens() is IUnitPat)
            {
              membersMask |= MemberPresenceFlag.PUBLIC_DEFAULT_CTOR;
              if (isStruct)
                membersMask |= MemberPresenceFlag.INSTANCE_CTOR;
            }
          }

          else if (constructorDeclOrSig is IConstructorSignature constructorSig)
          {
            if (constructorSig.ReturnTypeInfo?.ReturnType is IFunctionTypeUsage funTypeUsage && 
                funTypeUsage.ArgumentTypeUsage.IgnoreInnerParens() is INamedTypeUsage { ReferenceName: { ShortName: "unit" } } &&
                funTypeUsage.ReturnTypeUsage.IgnoreInnerParens() is INamedTypeUsage namedTypeUsage && 
                namedTypeUsage.ReferenceName?.ShortName == declaration.SourceName)
            {
              membersMask |= MemberPresenceFlag.PUBLIC_DEFAULT_CTOR;
              if (isStruct)
                membersMask |= MemberPresenceFlag.INSTANCE_CTOR;
            }
          }
        }
      }

      return membersMask;
    }