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