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 Microsoft.CodeAnalysis.Emit.Context(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); }
protected void EmbedReferences(Cci.ITypeDefinitionMember embeddedMember, TSyntaxNode syntaxNodeOpt, DiagnosticBag diagnostics) { Cci.NoPiaReferenceIndexer noPiaIndexer = new Cci.NoPiaReferenceIndexer(new EmitContext(ModuleBeingBuilt, syntaxNodeOpt, diagnostics)); noPiaIndexer.Visit(embeddedMember); }
protected void EmbedReferences(Cci.ITypeDefinitionMember embeddedMember, TSyntaxNode syntaxNodeOpt, DiagnosticBag diagnostics) { var noPiaIndexer = new Cci.NoPiaReferenceIndexer(new EmitContext(ModuleBeingBuilt, syntaxNodeOpt, diagnostics, metadataOnly: false, includePrivateMembers: true)); noPiaIndexer.Visit(embeddedMember); }