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