in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/FSharpAccessRights.cs [150:195]
public static bool IsAccessible(ITypeElement typeElement, ITreeNode context)
{
if (typeElement is IFSharpTypeElement fsTypeElement)
{
var fsAccessRights = fsTypeElement.GetFSharpAccessRights();
if (fsAccessRights.IsFilePrivate &&
context.GetSourceFile() is { } sourceFile && !fsTypeElement.HasDeclarationsIn(sourceFile))
return false;
var accessRights = fsAccessRights.AccessRights;
if (accessRights == AccessRights.PRIVATE && !IsTheSameOwner(fsTypeElement, context))
return false;
if (accessRights == AccessRights.INTERNAL && !typeElement.IsInternalsVisibleToApplies(context.GetPsiModule()))
return false;
if (fsTypeElement is IFSharpSourceTypeElement fsSourceTypeElement)
{
var typeModule = fsSourceTypeElement.Module;
var contextModule = context.GetPsiModule();
if (!typeModule.Equals(contextModule))
return accessRights == AccessRights.PUBLIC ||
accessRights == AccessRights.INTERNAL && typeModule.AreInternalsVisibleTo(contextModule);
var contextSourceFile = context.GetSourceFile();
var definingSourceFile = GetDefiningSourceFile(fsSourceTypeElement);
if (contextSourceFile != definingSourceFile)
{
var fcsProjectProvider = typeModule.GetSolution().GetComponent<IFcsProjectProvider>();
var definingFileIndex = fcsProjectProvider.GetFileIndex(definingSourceFile);
var contextFileIndex = fcsProjectProvider.GetFileIndex(contextSourceFile);
return definingFileIndex < contextFileIndex;
}
return IsAccessibleInsideTheSameFile(fsSourceTypeElement.DefiningDeclaration, context);
}
return true;
}
if (!ImportTypeUtil.TypeIsVisible(typeElement, context))
return false;
return true;
}