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