' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports System.Collections.Immutable Imports System.Runtime.InteropServices Imports System.Threading Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Partial Friend NotInheritable Class AnonymousTypeManager Friend MustInherit Class AnonymousTypeOrDelegatePublicSymbol Inherits InstanceTypeSymbol Public ReadOnly Manager As AnonymousTypeManager Public ReadOnly TypeDescriptor As AnonymousTypeDescriptor Protected Sub New(manager As AnonymousTypeManager, typeDescr As AnonymousTypeDescriptor) typeDescr.AssertGood() Debug.Assert(TypeKind = TypeKind.Class OrElse TypeKind = TypeKind.Delegate) Me.Manager = manager Me.TypeDescriptor = typeDescr End Sub Public NotOverridable Overrides ReadOnly Property Name As String Get Return String.Empty End Get End Property Friend NotOverridable Overrides ReadOnly Property MangleName As Boolean Get Return False End Get End Property Friend NotOverridable Overrides ReadOnly Property HasSpecialName As Boolean Get Return False End Get End Property Friend NotOverridable Overrides ReadOnly Property IsSerializable As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property Layout As TypeLayout Get Return Nothing End Get End Property Friend Overrides ReadOnly Property MarshallingCharSet As CharSet Get Return DefaultMarshallingCharSet End Get End Property Public MustOverride Overrides ReadOnly Property TypeKind As TYPEKIND Public Overrides ReadOnly Property Arity As Integer Get Return 0 End Get End Property Public Overrides ReadOnly Property TypeParameters As ImmutableArray(Of TypeParameterSymbol) Get Return ImmutableArray(Of TypeParameterSymbol).Empty End Get End Property Public Overrides ReadOnly Property IsMustInherit As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property IsNotInheritable As Boolean Get Return True End Get End Property Public Overrides ReadOnly Property MightContainExtensionMethods As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property HasCodeAnalysisEmbeddedAttribute As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property HasVisualBasicEmbeddedAttribute As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property IsExtensibleInterfaceNoUseSiteDiagnostics As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property DefaultPropertyName As String Get Return Nothing End Get End Property Friend Overrides Function MakeDeclaredBase(basesBeingResolved As ConsList(Of Symbol), diagnostics As DiagnosticBag) As NamedTypeSymbol Return MakeAcyclicBaseType(diagnostics) End Function Friend Overrides Function MakeDeclaredInterfaces(basesBeingResolved As ConsList(Of Symbol), diagnostics As DiagnosticBag) As ImmutableArray(Of NamedTypeSymbol) Return MakeAcyclicInterfaces(diagnostics) End Function Public Overrides Function GetMembers(name As String) As ImmutableArray(Of Symbol) ' TODO - Perf Return ImmutableArray.CreateRange(Of Symbol)(From member In GetMembers() Where CaseInsensitiveComparison.Equals(member.Name, name)) End Function Public Overrides ReadOnly Property MemberNames As IEnumerable(Of String) Get ' TODO - Perf Return New HashSet(Of String)(From member In GetMembers() Select member.Name) End Get End Property Public Overrides ReadOnly Property ContainingSymbol As Symbol Get Return Me.Manager.ContainingModule.GlobalNamespace End Get End Property Public Overrides ReadOnly Property ContainingType As NamedTypeSymbol Get ' this type is always global Return Nothing End Get End Property Public Overrides Function GetTypeMembers() As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Public Overrides Function GetTypeMembers(name As String) As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Public Overrides Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility Get Return Accessibility.Friend End Get End Property Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location) Get Return ImmutableArray.Create(Of Location)(Me.TypeDescriptor.Location) End Get End Property Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference) Get Return ImmutableArray(Of SyntaxReference).Empty End Get End Property Public Overrides ReadOnly Property IsAnonymousType As Boolean Get Return True End Get End Property Public NotOverridable Overrides ReadOnly Property IsImplicitlyDeclared As Boolean Get Return Me.TypeDescriptor.IsImplicitlyDeclared End Get End Property Friend Overrides ReadOnly Property IsWindowsRuntimeImport As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property ShouldAddWinRTMembers As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property IsComImport As Boolean Get Return False End Get End Property Friend Overrides ReadOnly Property CoClassType As TypeSymbol Get Return Nothing End Get End Property Friend Overrides Function GetAppliedConditionalSymbols() As ImmutableArray(Of String) Return ImmutableArray(Of String).Empty End Function Friend Overrides Function GetAttributeUsageInfo() As AttributeUsageInfo Throw ExceptionUtilities.Unreachable End Function Friend Overrides ReadOnly Property HasDeclarativeSecurity As Boolean Get Return False End Get End Property Friend NotOverridable Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData Get Return Nothing End Get End Property Friend Overrides Function GetSecurityInformation() As IEnumerable(Of Microsoft.Cci.SecurityAttribute) Throw ExceptionUtilities.Unreachable End Function ''' ''' Force all declaration errors to be generated. ''' Friend Overrides Sub GenerateDeclarationErrors(cancellationToken As CancellationToken) Throw ExceptionUtilities.Unreachable End Sub Friend MustOverride Overrides Function InternalSubstituteTypeParameters(substitution As TypeSubstitution) As TypeWithModifiers Friend NotOverridable Overrides Function GetFieldsToEmit() As IEnumerable(Of FieldSymbol) Throw ExceptionUtilities.Unreachable End Function ''' ''' Map an anonymous type or delegate public symbol to an implementation symbol to be ''' used in emit. ''' ''' NOTE: All anonymous types/delegated (except for delegate with signature 'Sub()') with the ''' same set of fields/parameters (field names and IsKey flags are taken into account) are ''' generated based on the same generic type template. ''' Public MustOverride Function MapToImplementationSymbol() As NamedTypeSymbol ''' ''' Map an anonymous type or delegate's method symbol to an implementation method symbol to be used in emit ''' Public Function MapMethodToImplementationSymbol(method As MethodSymbol) As MethodSymbol Debug.Assert(method.ContainingType Is Me) Return FindMethodInTypeProvided(method, MapToImplementationSymbol()) End Function ''' ''' Map an anonymous type or delegate's method symbol to a substituted method symbol. ''' Public Function FindSubstitutedMethodSymbol(method As MethodSymbol) As MethodSymbol Debug.Assert(method.ContainingType.IsAnonymousType) Return FindMethodInTypeProvided(method, Me) End Function Private Shared Function FindMethodInTypeProvided(method As MethodSymbol, type As NamedTypeSymbol) As MethodSymbol If type.IsDefinition Then ' Find a method by name ' Get method's index in owning type members Dim index As Integer = 0 For Each member In method.ContainingType.GetMembers() If member Is method Then Exit For End If index += 1 Next Debug.Assert(index < method.ContainingType.GetMembers().Length) ' Get a method in the type provided by it's index ' WARNING: this functionality assumes that 'type' has the ' same method indexes as the original type Dim mappedMethod As MethodSymbol = DirectCast(type.GetMembers()(index), MethodSymbol) Debug.Assert(IdentifierComparison.Equals(method.Name, mappedMethod.Name)) Debug.Assert(method.OverriddenMethod Is mappedMethod.OverriddenMethod) Return mappedMethod Else Dim otherTypeDef As NamedTypeSymbol = type.OriginalDefinition Dim methodInDefinition = FindMethodInTypeProvided(method, otherTypeDef) Return DirectCast(DirectCast(type, SubstitutedNamedType).GetMemberForDefinition(methodInDefinition), MethodSymbol) End If Throw ExceptionUtilities.Unreachable End Function Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol) Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)() End Function End Class End Class End Namespace