protected ModulePartBase()

in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/Cache2/Parts/ModulePartBase.cs [29:101]


    protected ModulePartBase([NotNull] T declaration, [NotNull] string shortName, MemberDecoration memberDecoration,
      [NotNull] ICacheBuilder cacheBuilder)
      : base(declaration, shortName, memberDecoration, 0, cacheBuilder)
    {
      var extensionMemberInfos = new LocalList<SourceExtensionMemberInfo>();

      foreach (var fsDecl in EnumerateExtensionMembers(declaration))
      {
        // todo: use candidate type
        var sourceName = fsDecl.SourceName;
        var extensionMemberInfo = new SourceExtensionMemberInfo(TypeDescriptor.ANY, fsDecl.GetTreeStartOffset(), sourceName, FSharpExtensionMemberKind.INSTANCE, this);
        extensionMemberInfos.Add(extensionMemberInfo);
      }

      FSharpExtensionMemberInfos = extensionMemberInfos.ToArray();

      var valueNames = new LocalList<string>();
      var functionNames = new LocalList<string>();
      var literalNames = new LocalList<string>();
      var activePatternNames = new LocalList<string>();
      var activePatternCaseNames = new LocalList<string>();
      
      foreach (var moduleMember in declaration.MembersEnumerable)
      {
        if (moduleMember is not ILetBindingsDeclaration letBindings) continue;

        foreach (var binding in letBindings.BindingsEnumerable)
        {
          if (binding.HeadPattern is not { } headPattern) continue;

          foreach (var pat in headPattern.NestedPatterns)
          {
            // todo: complex patterns
            if (pat is not IReferencePat refPat || refPat.GetAccessRights() != AccessRights.PUBLIC) continue;

            var name = refPat.SourceName;
            if (refPat.NameIdentifier is IActivePatternId activePatternId)
            {
              activePatternNames.Add(name);
              foreach (var activePatternCase in activePatternId.CasesEnumerable)
              {
                if (activePatternCase is IActivePatternCaseName {Identifier.Name: var caseName })
                  activePatternCaseNames.Add(caseName);
              }
            }
            else
            {
              if (binding.ParametersDeclarationsEnumerable.IsEmpty())
              {
                if (binding.IsLiteral)
                  literalNames.Add(name);
                else
                  valueNames.Add(name);
              }
              else
              {
                functionNames.Add(name);
              }
            }
          }
        }
      }

      ValueNames = valueNames.ToArray();
      FunctionNames = functionNames.ToArray();
      LiteralNames = literalNames.ToArray();
      ActivePatternNames = activePatternNames.ToArray();
      ActivePatternCaseNames = activePatternCaseNames.ToArray();

      HasAssociatedType =
        declaration is INestedModuleDeclaration nestedModuleDecl &&
        nestedModuleDecl.GetAssociatedTypeDeclaration(out _) != null;
    }