private void VisitTypeName(TextNode referencePath, string @namespace, string topLevelName, IReadOnlyList <string> nestedNames)
            {
                if (ignoredNamespaces.TryGetValue(@namespace, out var builder) &&
                    builder.TryUnignore(referencePath, topLevelName, nestedNames, out var unignoredType))
                {
                    var typeName = !string.IsNullOrEmpty(@namespace)
                        ? (TextNode.Root(@namespace) + ".") + topLevelName
                        : TextNode.Root(topLevelName);

                    foreach (var name in nestedNames)
                    {
                        typeName = (typeName + ".") + name;
                    }

                    VisitNonignoredType(typeName, unignoredType);
                }
            }
            public static IReadOnlyList <IMetadataNamespace> CalculateNonignoredTransitiveClosure(IMetadataSource source, IEnumerable <string> ignoredNamespaces, IMetadataReferenceResolver metadataReferenceResolver)
            {
                var regexBuilder = (StringBuilder)null;

                foreach (var ignoredNamespace in ignoredNamespaces)
                {
                    if (regexBuilder == null)
                    {
                        regexBuilder = new StringBuilder(@"\A(?:");
                    }
                    else
                    {
                        regexBuilder.Append('|');
                    }

                    regexBuilder.Append(Regex.Escape(ignoredNamespace));
                }

                if (regexBuilder == null)
                {
                    return(source.Namespaces);
                }

                var namespaceIgnoreRegex = new Regex(regexBuilder.Append(@")(\Z|\.)").ToString(), RegexOptions.IgnoreCase);

                var ignoredNamespaceLookup = new Dictionary <string, PartiallyIgnoredNamespaceBuilder>();

                var includedNamespaces = new List <IMetadataNamespace>(source.Namespaces.Count);

                foreach (var ns in source.Namespaces)
                {
                    if (namespaceIgnoreRegex.IsMatch(ns.Name))
                    {
                        ignoredNamespaceLookup.Add(ns.Name, new PartiallyIgnoredNamespaceBuilder(ns));
                    }
                    else
                    {
                        includedNamespaces.Add(ns);
                    }
                }

                if (ignoredNamespaceLookup.Count != 0)
                {
                    var visitor = new ReferencedIgnoredMetadataVisitor(ignoredNamespaceLookup, metadataReferenceResolver);

                    foreach (var ns in includedNamespaces)
                    {
                        var prefix = string.IsNullOrEmpty(ns.Name) ? null : TextNode.Root(ns.Name) + ".";
                        foreach (var type in ns.Types)
                        {
                            visitor.VisitNonignoredType(prefix + type.Name, type);
                        }
                    }

                    foreach (var ns in visitor.ignoredNamespaces.Values)
                    {
                        if (ns.Types.Count != 0)
                        {
                            includedNamespaces.Add(ns);
                        }
                    }
                }

                return(includedNamespaces);
            }