// Internal for unit testing
        internal IEnumerable <ITypeInfo> GetExportedTypes(string assemblyName)
        {
            if (string.Equals(_compilation.AssemblyName, assemblyName, StringComparison.Ordinal))
            {
                return(GetExportedTypes(_compilation.Assembly));
            }
            else
            {
                foreach (var reference in _compilation.References)
                {
                    var compilationReference = reference as CompilationReference;
                    if (compilationReference != null &&
                        string.Equals(
                            compilationReference.Compilation.AssemblyName,
                            assemblyName,
                            StringComparison.Ordinal))
                    {
                        return(GetExportedTypes(compilationReference.Compilation.Assembly));
                    }

                    var assemblySymbol = _compilation.GetAssemblyOrModuleSymbol(reference) as IAssemblySymbol;
                    if (string.Equals(
                            assemblySymbol?.Identity.Name,
                            assemblyName,
                            StringComparison.Ordinal))
                    {
                        return(GetExportedTypes(assemblySymbol));
                    }
                }
            }

            throw new InvalidOperationException(
                      Resources.FormatCodeAnalysis_UnableToLoadAssemblyReference(assemblyName));
        }