Exemplo n.º 1
0
        private ImmutableArray <Cci.NamespaceScope> BuildNamespaceScopes(ConsList <Imports> debugImports)
        {
            var namespaceScopes = ArrayBuilder <Cci.NamespaceScope> .GetInstance();

            // NOTE: All extern aliases are stored on the outermost Imports object.
            var validExternAliases = PooledHashSet <string> .GetInstance();

            foreach (AliasAndExternAliasDirective externAlias in debugImports.Last().ExternAliases.NullToEmpty())
            {
                validExternAliases.Add(externAlias.Alias.Name);
            }

            foreach (Imports imports in debugImports)
            {
                var usedNamespaces = ArrayBuilder <Cci.UsedNamespaceOrType> .GetInstance();

                // NOTE: order based on dev10: extern aliases, then usings, then aliases namespaces and types

                ImmutableArray <AliasAndExternAliasDirective> externAliases = imports.ExternAliases;
                if (!externAliases.IsDefault)
                {
                    foreach (var alias in externAliases)
                    {
                        usedNamespaces.Add(Cci.UsedNamespaceOrType.CreateCSharpExternNamespace(alias.Alias.Name));
                    }
                }

                ImmutableArray <NamespaceOrTypeAndUsingDirective> usings = imports.Usings;
                if (!usings.IsDefault)
                {
                    foreach (var nsOrType in usings)
                    {
                        NamespaceOrTypeSymbol namespaceOrType = nsOrType.NamespaceOrType;
                        string namespaceOrTypeString          = GetNamespaceOrTypeString(namespaceOrType);
                        if (namespaceOrType.IsNamespace)
                        {
                            string externAlias = GuessExternAlias((NamespaceSymbol)namespaceOrType, validExternAliases);
                            usedNamespaces.Add(Cci.UsedNamespaceOrType.CreateCSharpNamespace(namespaceOrTypeString, externAlias));
                        }
                        else
                        {
                            Debug.Assert(namespaceOrType is TypeSymbol);
                            usedNamespaces.Add(Cci.UsedNamespaceOrType.CreateCSharpType(namespaceOrTypeString));
                        }
                    }
                }

                Dictionary <string, AliasAndUsingDirective> aliasSymbols = imports.UsingAliases;
                if (aliasSymbols != null)
                {
                    foreach (var pair in aliasSymbols)
                    {
                        var alias  = pair.Key;
                        var symbol = pair.Value.Alias;
                        Debug.Assert(!symbol.IsExtern);

                        var target       = symbol.Target;
                        var targetString = GetNamespaceOrTypeString(target);
                        if (target.Kind == SymbolKind.Namespace)
                        {
                            string externAlias = GuessExternAlias((NamespaceSymbol)target, validExternAliases);

                            usedNamespaces.Add(Cci.UsedNamespaceOrType.CreateCSharpNamespaceAlias(targetString, alias, externAlias));
                        }
                        else
                        {
                            Debug.Assert(target is TypeSymbol);
                            usedNamespaces.Add(Cci.UsedNamespaceOrType.CreateCSharpTypeAlias(targetString, alias));
                        }
                    }
                }

                namespaceScopes.Add(new Cci.NamespaceScope(usedNamespaces.ToImmutableAndFree()));
            }

            validExternAliases.Free();

            return(namespaceScopes.ToImmutableAndFree()); //NOTE: inner-to-outer order matches dev10
        }