private async Task <IEnumerable <RelatedSymbolPair> > GetDerivedInterfacesAsync([NotNull] ISymbol symbol)
        {
            var namedTypeSymbol   = symbol.EnsureType <INamedTypeSymbol>();
            var derivedInterfaces = await FindDerivedInterfacesAsync(namedTypeSymbol);

            return(derivedInterfaces.Select(
                       i => new RelatedSymbolPair(
                           namedTypeSymbol,
                           i,
                           DirectedModelRelationshipTypes.Subtype)));
        }
        private async Task <IEnumerable <RelatedSymbolPair> > GetImplementingTypesAsync([NotNull] ISymbol symbol)
        {
            var namedTypeSymbol   = symbol.EnsureType <INamedTypeSymbol>();
            var implementingTypes = await FindImplementingTypesAsync(namedTypeSymbol);

            return(implementingTypes.Select(
                       i => new RelatedSymbolPair(
                           namedTypeSymbol,
                           i,
                           DirectedModelRelationshipTypes.ImplementerType)));
        }
        private Task <IEnumerable <RelatedSymbolPair> > GetImplementedInterfacesAsync([NotNull] ISymbol symbol)
        {
            var namedTypeSymbol = symbol.EnsureType <INamedTypeSymbol>();

            var result = namedTypeSymbol.Interfaces.Where(i => i.TypeKind == TypeKind.Interface)
                         .Select(
                i => new RelatedSymbolPair(
                    namedTypeSymbol,
                    i,
                    DirectedModelRelationshipTypes.ImplementedInterface));

            return(Task.FromResult(result));
        }
        private Task <IEnumerable <RelatedSymbolPair> > GetMembersAsync([NotNull] ISymbol symbol)
        {
            var typeSymbol = symbol.EnsureType <ITypeSymbol>();

            var result = typeSymbol.GetMembers()
                         .Where(_roslynSymbolTranslator.IsModeledMember)
                         .Select(
                i => new RelatedSymbolPair(
                    typeSymbol,
                    i,
                    CommonDirectedModelRelationshipTypes.Contained));

            return(Task.FromResult(result));
        }
        private async Task <IEnumerable <INamedTypeSymbol> > FindDerivedInterfacesAsync([NotNull] ISymbol symbol)
        {
            var namedTypeSymbol = symbol.EnsureType <INamedTypeSymbol>();

            var result = new List <INamedTypeSymbol>();

            foreach (var compilation in await GetCompilationsAsync())
            {
                var visitor = new DerivedInterfacesFinderVisitor(namedTypeSymbol, _symbolEqualityComparer);
                compilation.Assembly?.Accept(visitor);

                result.AddRange(visitor.DerivedInterfaces);
            }

            return(result);
        }
        private async Task <IEnumerable <RelatedSymbolPair> > GetDerivedTypesAsync([NotNull] ISymbol symbol)
        {
            var classSymbol = symbol.EnsureType <INamedTypeSymbol>();

            var solution = await GetCurrentSolutionAsync();

            var derivedClasses = await SymbolFinder.FindDerivedClassesAsync(classSymbol, solution);

            return(derivedClasses
                   .Where(i => _symbolEqualityComparer.Equals(classSymbol, i.BaseType.OriginalDefinition) && i.TypeKind == TypeKind.Class)
                   .Select(
                       i => new RelatedSymbolPair(
                           classSymbol,
                           i,
                           DirectedModelRelationshipTypes.Subtype)));
        }
        private Task <IEnumerable <RelatedSymbolPair> > GetAssociatedTypesAsync([NotNull] ISymbol symbol)
        {
            var typeSymbol = symbol.EnsureType <ITypeSymbol>();

            var result = typeSymbol.GetMembers()
                         .Where(_roslynSymbolTranslator.IsModeledMember)
                         .Where(_roslynSymbolTranslator.IsAssociationMember)
                         .Select(i => _roslynSymbolTranslator.GetTypeSymbolOfMemberSymbol(i))
                         .Where(i => _roslynSymbolTranslator.IsModeledType(i))
                         .Select(
                i => new RelatedSymbolPair(
                    typeSymbol,
                    i,
                    DirectedModelRelationshipTypes.AssociatedType));

            return(Task.FromResult(result));
        }
        private static Task <IEnumerable <RelatedSymbolPair> > GetBaseTypesAsync([NotNull] ISymbol symbol)
        {
            var result = new List <RelatedSymbolPair>();

            var typeSymbol = symbol.EnsureType <ITypeSymbol>();
            var baseSymbol = typeSymbol.BaseType;

            if (baseSymbol?.TypeKind == TypeKind.Class)
            {
                result.Add(
                    new RelatedSymbolPair(
                        typeSymbol,
                        baseSymbol,
                        DirectedModelRelationshipTypes.BaseType));
            }

            return(Task.FromResult((IEnumerable <RelatedSymbolPair>)result));
        }