in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Searching/FSharpSearcherFactory.cs [71:117]
public override IEnumerable<RelatedDeclaredElement> GetRelatedDeclaredElements(IDeclaredElement element)
{
if (element is IFSharpUnionCase unionCase)
return unionCase.GetGeneratedMembers().Select(member => new RelatedDeclaredElement(member));
if (element is IFSharpGeneratedConstructorParameterOwner parameterOwner &&
parameterOwner.GetGeneratedParameter() is { } parameter)
return new[] {new RelatedDeclaredElement(parameter)};
if (element is IFSharpProperty { IsIndexerLike: true } property)
return property.Accessors.Select(member => new RelatedDeclaredElement(member));
if (element is IFSharpSourceTypeElement typeElement && typeElement.IsUnion())
{
var result = new List<RelatedDeclaredElement>();
foreach (var sourceUnionCase in typeElement.GetSourceUnionCases())
{
result.Add(new RelatedDeclaredElement(sourceUnionCase));
result.AddRange(sourceUnionCase.GetGeneratedMembers().Select(member => new RelatedDeclaredElement(member)));
}
return result;
}
if (element is IFSharpCompiledTypeElement { Representation: FSharpCompiledTypeRepresentation.Union union } fsCompiledTypeElement)
{
var result = new List<RelatedDeclaredElement>();
foreach (var name in union.cases)
{
var generatedMembers = GeneratedMembersUtil.GetCompiledUnionCaseGeneratedMembers(fsCompiledTypeElement, name);
result.AddRange(generatedMembers.Select(member => new RelatedDeclaredElement(member)));
}
return result;
}
if (element is IFSharpGeneratedParameterFromPattern fsParameter)
return fsParameter.GetParameterOriginElements().Select(paramOrigin => new RelatedDeclaredElement(paramOrigin));
if (element is IReferencePat refPat && refPat.TryGetDeclaredFSharpParameter() is { } patternFsParam)
return [new RelatedDeclaredElement(patternFsParam)];
if (element is IParameterSignatureTypeUsage { FSharpParameter: { } sigFsParam })
return [new RelatedDeclaredElement(sigFsParam)];
return EmptyList<RelatedDeclaredElement>.Instance;
}