private ImmutableArray <INamedTypeSymbol> FindAllValidDestinations(
            ISymbol selectedMember,
            Solution solution,
            CancellationToken cancellationToken)
        {
            var containingType  = selectedMember.ContainingType;
            var allDestinations = selectedMember.IsKind(SymbolKind.Field)
                ? containingType.GetBaseTypes().ToImmutableArray()
                : containingType.AllInterfaces.Concat(containingType.GetBaseTypes()).ToImmutableArray();

            return(allDestinations.WhereAsArray(destination => MemberAndDestinationValidator.IsDestinationValid(solution, destination, cancellationToken)));
        }
Esempio n. 2
0
        public static BaseTypeTreeNodeViewModel CreateBaseTypeTree(
            IGlyphService glyphService,
            Solution solution,
            INamedTypeSymbol root,
            CancellationToken cancellationToken
            )
        {
            var rootTreeNode = new BaseTypeTreeNodeViewModel(root, glyphService)
            {
                IsChecked  = false,
                IsExpanded = true
            };
            var queue = new Queue <BaseTypeTreeNodeViewModel>();

            queue.Enqueue(rootTreeNode);
            while (queue.Any())
            {
                var currentTreeNode   = queue.Dequeue();
                var currentTypeSymbol = currentTreeNode.Symbol;

                currentTreeNode.BaseTypeNodes = currentTypeSymbol.Interfaces
                                                .Concat(currentTypeSymbol.BaseType)
                                                .Where(
                    baseType =>
                    baseType != null &&
                    MemberAndDestinationValidator.IsDestinationValid(
                        solution,
                        baseType,
                        cancellationToken
                        )
                    )
                                                .OrderBy(baseType => baseType.ToDisplayString())
                                                .Select(
                    baseType =>
                    new BaseTypeTreeNodeViewModel(baseType, glyphService)
                {
                    IsChecked  = false,
                    IsExpanded = true
                }
                    )
                                                .ToImmutableArray();

                foreach (var node in currentTreeNode.BaseTypeNodes)
                {
                    queue.Enqueue(node);
                }
            }

            return(rootTreeNode);
        }