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 }