public override IEnumerable GetRelatedDeclaredElements()

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