private async Task <IEnumerable <INamedTypeSymbol> > FindImplementingTypesAsync([NotNull] INamedTypeSymbol interfaceSymbol) { var result = new List <INamedTypeSymbol>(); var solution = await GetCurrentSolutionAsync(); var implementerSymbols = await SymbolFinder.FindImplementationsAsync(interfaceSymbol, solution); foreach (var namedTypeSymbol in implementerSymbols.OfType <INamedTypeSymbol>()) { var interfaces = namedTypeSymbol.Interfaces.Select(i => i.OriginalDefinition); if (interfaces.Any(i => _symbolEqualityComparer.Equals(i, interfaceSymbol))) { result.Add(namedTypeSymbol); } } // For some reason SymbolFinder does not find implementer structs. So we also make a search with a visitor. foreach (var compilation in await GetCompilationsAsync()) { var visitor = new ImplementingTypesFinderVisitor(interfaceSymbol); compilation.Assembly?.Accept(visitor); result.AddRange(visitor.ImplementingTypeSymbols.Where(i => i.TypeKind == TypeKind.Struct)); } return(result); }
private static IEnumerable <INamedTypeSymbol> FindImplementingTypes(Workspace workspace, INamedTypeSymbol interfaceSymbol) { var implementerSymbols = SymbolFinder.FindImplementationsAsync(interfaceSymbol, workspace.CurrentSolution).Result; foreach (var namedTypeSymbol in implementerSymbols.OfType <INamedTypeSymbol>()) { var interfaces = namedTypeSymbol.Interfaces.Select(i => i.OriginalDefinition); if (interfaces.Any(i => i.SymbolEquals(interfaceSymbol))) { yield return(namedTypeSymbol); } } // For some reason SymbolFinder does not find implementer structs. So we also make a search with a visitor. foreach (var compilation in GetCompilations(workspace)) { var visitor = new ImplementingTypesFinderVisitor(interfaceSymbol); compilation.Assembly?.Accept(visitor); foreach (var descendant in visitor.ImplementingTypeSymbols.Where(i => i.TypeKind == TypeKind.Struct)) { yield return(descendant); } } }