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