private ImmutableArray<EnvDTE.CodeElement> EnumerateOverloads() { var symbol = (IMethodSymbol)ParentElement.LookupSymbol(); // Only methods and constructors can be overloaded. However, all functions // can successfully return a collection of overloaded functions; if not // really overloaded, the collection contains just the original function. if (symbol.MethodKind != MethodKind.Ordinary && symbol.MethodKind != MethodKind.Constructor) { return ImmutableArray.Create((EnvDTE.CodeElement)Parent); } var overloadsBuilder = ImmutableArray.CreateBuilder<EnvDTE.CodeElement>(); foreach (var method in symbol.ContainingType.GetMembers(symbol.Name)) { if (method.Kind != SymbolKind.Method) { continue; } var location = method.Locations.FirstOrDefault(l => l.IsInSource); if (location != null) { var tree = location.SourceTree; var document = this.Workspace.CurrentSolution.GetDocument(tree); var fileCodeModelObject = this.Workspace.GetFileCodeModel(document.Id); var fileCodeModel = ComAggregate.GetManagedObject<FileCodeModel>(fileCodeModelObject); var element = fileCodeModel.CodeElementFromPosition(location.SourceSpan.Start, EnvDTE.vsCMElement.vsCMElementFunction); if (element != null) { overloadsBuilder.Add(element); } } } return overloadsBuilder.ToImmutable(); }