Ejemplo n.º 1
0
        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();
        }