public sealed override ImmutableArray <Symbol> GetMembers(string name) { EnsureAllMembersLoaded(); PENestedNamespaceSymbol ns = null; ImmutableArray <PENamedTypeSymbol> t; if (lazyNamespaces.TryGetValue(name, out ns)) { if (lazyTypes.TryGetValue(name, out t)) { // TODO - Eliminate the copy by storing all members and type members instead of non-type and type members? return(StaticCast <Symbol> .From(t).Add(ns)); } else { return(ImmutableArray.Create <Symbol>(ns)); } } else if (lazyTypes.TryGetValue(name, out t)) { return(StaticCast <Symbol> .From(t)); } return(ImmutableArray <Symbol> .Empty); }
/// <summary> /// Create symbols for nested namespaces and initialize namespaces map. /// </summary> private void LazyInitializeNamespaces( IEnumerable <KeyValuePair <string, IEnumerable <IGrouping <string, TypeDefinitionHandle> > > > childNamespaces) { if (this.lazyNamespaces == null) { var namespaces = new Dictionary <string, PENestedNamespaceSymbol>(StringOrdinalComparer.Instance); foreach (var child in childNamespaces) { var c = new PENestedNamespaceSymbol(child.Key, this, child.Value); namespaces.Add(c.Name, c); } Interlocked.CompareExchange(ref this.lazyNamespaces, namespaces, null); } }