public static bool IsAccessible()

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