Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
            }
        }