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