private static void VisitTopLevelType(Cci.NoPiaReferenceIndexer noPiaIndexer, Cci.INamespaceTypeDefinition type) { if (noPiaIndexer != null) { noPiaIndexer.Visit((Cci.ITypeDefinition)type); } }
private IEnumerable <Cci.INamespaceTypeDefinition> GetTopLevelTypes(EmitContext context) { Cci.NoPiaReferenceIndexer noPiaIndexer = null; HashSet <string> names; // First time through, we need to collect emitted names of all top level types. if (_namesOfTopLevelTypes == null) { names = new HashSet <string>(); } else { names = null; } // First time through, we need to push things through NoPiaReferenceIndexer // to make sure we collect all to be embedded NoPia types and members. if (EmbeddedTypesManagerOpt != null && !EmbeddedTypesManagerOpt.IsFrozen) { noPiaIndexer = new Cci.NoPiaReferenceIndexer(context); Debug.Assert(names != null); this.Dispatch(noPiaIndexer); } AddTopLevelType(names, _rootModuleType); VisitTopLevelType(noPiaIndexer, _rootModuleType); yield return(_rootModuleType); foreach (var type in this.GetAnonymousTypes()) { AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); } foreach (var type in this.GetTopLevelTypesCore(context)) { AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); } var privateImpl = this.PrivateImplClass; if (privateImpl != null) { AddTopLevelType(names, privateImpl); VisitTopLevelType(noPiaIndexer, privateImpl); yield return(privateImpl); } if (EmbeddedTypesManagerOpt != null) { foreach (var embedded in EmbeddedTypesManagerOpt.GetTypes(context.Diagnostics, names)) { AddTopLevelType(names, embedded); yield return(embedded); } } if (names != null) { Debug.Assert(_namesOfTopLevelTypes == null); _namesOfTopLevelTypes = names; } }
private EmbeddedType EmbedType( NamedTypeSymbol namedType, bool fromImplements, CSharpSyntaxNode syntaxNodeOpt, DiagnosticBag diagnostics) { Debug.Assert(namedType.IsDefinition); EmbeddedType embedded = new EmbeddedType(this, namedType); EmbeddedType cached = EmbeddedTypesMap.GetOrAdd(namedType, embedded); bool isInterface = (namedType.IsInterface); if (isInterface && fromImplements) { // Note, we must use 'cached' here because we might drop 'embedded' below. cached.EmbedAllMembersOfImplementedInterface(syntaxNodeOpt, diagnostics); } if (embedded != cached) { return(cached); } // We do not expect this method to be called on a different thread once GetTypes is called. // Therefore, the following check can be as simple as: Debug.Assert(!IsFrozen, "Set of embedded types is frozen."); var noPiaIndexer = new Cci.NoPiaReferenceIndexer(new EmitContext(ModuleBeingBuilt, syntaxNodeOpt, diagnostics)); // Make sure we embed all types referenced by the type declaration: implemented interfaces, etc. noPiaIndexer.VisitTypeDefinitionNoMembers(embedded); if (!isInterface) { Debug.Assert(namedType.TypeKind == TypeKind.Struct || namedType.TypeKind == TypeKind.Enum || namedType.TypeKind == TypeKind.Delegate); // For structures, enums and delegates we embed all members. if (namedType.TypeKind == TypeKind.Struct || namedType.TypeKind == TypeKind.Enum) { // TODO: When building debug versions in the IDE, the compiler will insert some extra members // that support ENC. These make no sense in local types, so we will skip them. We have to // check for them explicitly or they will trip the member-validity check that follows. } foreach (FieldSymbol f in namedType.GetFieldsToEmit()) { EmbedField(embedded, f, syntaxNodeOpt, diagnostics); } foreach (MethodSymbol m in namedType.GetMethodsToEmit()) { if ((object)m != null) { EmbedMethod(embedded, m, syntaxNodeOpt, diagnostics); } } // We also should embed properties and events, but we don't need to do this explicitly here // because accessors embed them automatically. } return(embedded); }
/// <summary> /// Returns all top-level (not nested) types defined in the module. /// </summary> public override IEnumerable <Cci.INamespaceTypeDefinition> GetTopLevelTypes(EmitContext context) { Cci.NoPiaReferenceIndexer noPiaIndexer = null; HashSet <string> names; // First time through, we need to collect emitted names of all top level types. if (_namesOfTopLevelTypes == null) { names = new HashSet <string>(); } else { names = null; } // First time through, we need to push things through NoPiaReferenceIndexer // to make sure we collect all to be embedded NoPia types and members. if (EmbeddedTypesManagerOpt != null && !EmbeddedTypesManagerOpt.IsFrozen) { noPiaIndexer = new Cci.NoPiaReferenceIndexer(context); Debug.Assert(names != null); this.Dispatch(noPiaIndexer); } #if XSHARP // Replace generation of the _rootModule with the generated // <Module> class when available Cci.INamespaceTypeDefinition topType = null; foreach (var type in this.GetTopLevelTypesCore(context)) { if (String.Equals(type.Name, _rootModuleType.Name)) { topType = type; AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); } } if (topType == null) { AddTopLevelType(names, _rootModuleType); VisitTopLevelType(noPiaIndexer, _rootModuleType); yield return(_rootModuleType); } #else AddTopLevelType(names, _rootModuleType); VisitTopLevelType(noPiaIndexer, _rootModuleType); yield return(_rootModuleType); #endif foreach (var type in this.GetAnonymousTypes(context)) { AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); } foreach (var type in this.GetTopLevelTypesCore(context)) { #if XSHARP // Skip when class has been included as top level if (type != topType) { AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); } #else AddTopLevelType(names, type); VisitTopLevelType(noPiaIndexer, type); yield return(type); #endif } var privateImpl = this.PrivateImplClass; if (privateImpl != null) { AddTopLevelType(names, privateImpl); VisitTopLevelType(noPiaIndexer, privateImpl); yield return(privateImpl); } if (EmbeddedTypesManagerOpt != null) { foreach (var embedded in EmbeddedTypesManagerOpt.GetTypes(context.Diagnostics, names)) { AddTopLevelType(names, embedded); yield return(embedded); } } if (names != null) { Debug.Assert(_namesOfTopLevelTypes == null); _namesOfTopLevelTypes = names; } }