| File: Symbols\UnboundGenericType.vb | Web Access |
| Project: src\roslyn\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic) |
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports System.Collections.Generic Imports System.Collections.Immutable Imports System.Collections.ObjectModel Imports System.Globalization Imports System.Runtime.InteropServices Imports System.Text Imports System.Threading Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports TypeKind = Microsoft.CodeAnalysis.TypeKind Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Friend MustInherit Class UnboundGenericType Inherits NamedTypeSymbol Friend Shared ReadOnly UnboundTypeArgument As New ErrorTypeSymbol() ''' <summary> ''' Given a possibly constructed/specialized generic type, create a symbol ''' to represent an unbound generic type for its definition. ''' </summary> Friend Shared Function Create(type As NamedTypeSymbol) As NamedTypeSymbol If type.IsUnboundGenericType Then Return type End If Dim specialized = TryCast(type, UnboundGenericType.ConstructedFromSymbol) If specialized IsNot Nothing Then Return specialized.Constructed End If If type.IsGenericType Then Return New UnboundGenericType.ConstructedSymbol(type.OriginalDefinition) End If 'EDMAURER This exception is part of the public contract of NamedTypeSymbol.ConstructUnboundGenericType Throw New InvalidOperationException() End Function Private Sub New() End Sub Public Overrides ReadOnly Property Name As String Get Return OriginalDefinition.Name End Get End Property Friend Overrides ReadOnly Property MangleName As Boolean Get Return OriginalDefinition.MangleName End Get End Property Public Overrides Function GetDocumentationCommentXml(Optional preferredCulture As CultureInfo = Nothing, Optional expandIncludes As Boolean = False, Optional cancellationToken As CancellationToken = Nothing) As String Return OriginalDefinition.GetDocumentationCommentXml(preferredCulture, expandIncludes, cancellationToken) End Function Friend NotOverridable Overrides ReadOnly Property HasSpecialName As Boolean Get Return OriginalDefinition.HasSpecialName End Get End Property Public NotOverridable Overrides ReadOnly Property IsSerializable As Boolean Get Return OriginalDefinition.IsSerializable End Get End Property Friend Overrides ReadOnly Property Layout As TypeLayout Get Return OriginalDefinition.Layout End Get End Property Friend Overrides ReadOnly Property MarshallingCharSet As CharSet Get Return OriginalDefinition.MarshallingCharSet End Get End Property Public MustOverride Overrides ReadOnly Property IsUnboundGenericType As Boolean Public Overrides ReadOnly Property IsAnonymousType As Boolean Get Return OriginalDefinition.IsAnonymousType End Get End Property Public MustOverride Overrides ReadOnly Property OriginalDefinition As NamedTypeSymbol Public MustOverride Overrides ReadOnly Property ContainingSymbol As Symbol Public Overrides ReadOnly Property Arity As Integer Get Return OriginalDefinition.Arity End Get End Property Public MustOverride Overrides ReadOnly Property TypeParameters As ImmutableArray(Of TypeParameterSymbol) Public MustOverride Overrides ReadOnly Property ConstructedFrom As NamedTypeSymbol Friend MustOverride Overrides ReadOnly Property TypeArgumentsNoUseSiteDiagnostics As ImmutableArray(Of TypeSymbol) Public NotOverridable Overrides Function GetTypeArgumentCustomModifiers(ordinal As Integer) As ImmutableArray(Of CustomModifier) Return GetEmptyTypeArgumentCustomModifiers(ordinal) End Function Friend NotOverridable Overrides ReadOnly Property HasTypeArgumentsCustomModifiers As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property EnumUnderlyingType As NamedTypeSymbol Get Return OriginalDefinition.EnumUnderlyingType 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 OriginalDefinition.HasCodeAnalysisEmbeddedAttribute End Get End Property Friend Overrides ReadOnly Property HasVisualBasicEmbeddedAttribute As Boolean Get Return OriginalDefinition.HasVisualBasicEmbeddedAttribute End Get End Property Friend Overrides ReadOnly Property HasCompilerLoweringPreserveAttribute As Boolean Get Return OriginalDefinition.HasCompilerLoweringPreserveAttribute End Get End Property Friend Overrides ReadOnly Property IsExtensibleInterfaceNoUseSiteDiagnostics As Boolean Get Return OriginalDefinition.IsExtensibleInterfaceNoUseSiteDiagnostics End Get End Property Friend Overrides ReadOnly Property IsWindowsRuntimeImport As Boolean Get Return OriginalDefinition.IsWindowsRuntimeImport End Get End Property Friend Overrides ReadOnly Property ShouldAddWinRTMembers As Boolean Get Return OriginalDefinition.ShouldAddWinRTMembers End Get End Property Friend Overrides ReadOnly Property IsComImport As Boolean Get Return OriginalDefinition.IsComImport End Get End Property Friend Overrides ReadOnly Property CoClassType As TypeSymbol Get Return OriginalDefinition.CoClassType End Get End Property Friend Overrides Function GetAppliedConditionalSymbols() As ImmutableArray(Of String) Return OriginalDefinition.GetAppliedConditionalSymbols() End Function Friend Overrides Function GetAttributeUsageInfo() As AttributeUsageInfo Return OriginalDefinition.GetAttributeUsageInfo() End Function Friend Overrides ReadOnly Property HasDeclarativeSecurity As Boolean Get Return OriginalDefinition.HasDeclarativeSecurity End Get End Property Friend Overrides Function GetSecurityInformation() As IEnumerable(Of Microsoft.Cci.SecurityAttribute) Return OriginalDefinition.GetSecurityInformation() End Function Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility Get Return OriginalDefinition.DeclaredAccessibility End Get End Property Public Overrides ReadOnly Property TypeKind As TypeKind Get Return OriginalDefinition.TypeKind End Get End Property Friend Overrides ReadOnly Property IsInterface As Boolean Get Return OriginalDefinition.IsInterface End Get End Property Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location) Get Return OriginalDefinition.Locations End Get End Property Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference) Get Return OriginalDefinition.DeclaringSyntaxReferences End Get End Property Public Overrides ReadOnly Property IsMustInherit As Boolean Get Return OriginalDefinition.IsMustInherit End Get End Property Public Overrides ReadOnly Property IsNotInheritable As Boolean Get Return OriginalDefinition.IsNotInheritable End Get End Property Friend NotOverridable Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData Get Return OriginalDefinition.ObsoleteAttributeData End Get End Property Public Overrides Function GetAttributes() As ImmutableArray(Of VisualBasicAttributeData) Return OriginalDefinition.GetAttributes() End Function Friend Overrides Function LookupMetadataType(ByRef emittedTypeName As MetadataTypeName) As NamedTypeSymbol Throw ExceptionUtilities.Unreachable End Function Friend MustOverride Overrides Function InternalSubstituteTypeParameters(additionalSubstitution As TypeSubstitution) As TypeWithModifiers Friend Overrides Function MakeDeclaredBase(basesBeingResolved As BasesBeingResolved, diagnostics As BindingDiagnosticBag) As NamedTypeSymbol Return Nothing End Function Friend Overrides Function MakeAcyclicBaseType(diagnostics As BindingDiagnosticBag) As NamedTypeSymbol Return Nothing End Function Friend Overrides Function GetDirectBaseTypeNoUseSiteDiagnostics(basesBeingResolved As BasesBeingResolved) As NamedTypeSymbol Return Nothing End Function Friend Overrides Function GetDeclaredBase(basesBeingResolved As BasesBeingResolved) As NamedTypeSymbol Return Nothing End Function Friend Overrides Function MakeDeclaredInterfaces(basesBeingResolved As BasesBeingResolved, diagnostics As BindingDiagnosticBag) As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Friend Overrides Function MakeAcyclicInterfaces(diagnostics As BindingDiagnosticBag) As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Friend Overrides Function GetDeclaredInterfacesNoUseSiteDiagnostics(basesBeingResolved As BasesBeingResolved) As ImmutableArray(Of NamedTypeSymbol) Return ImmutableArray(Of NamedTypeSymbol).Empty End Function Friend Overrides Function GetUseSiteInfo() As UseSiteInfo(Of AssemblySymbol) Return OriginalDefinition.GetUseSiteInfo() End Function Public NotOverridable Overrides Function Equals(other As TypeSymbol, comparison As TypeCompareKind) As Boolean Return Equals(TryCast(other, UnboundGenericType), comparison) End Function Public Overloads Function Equals(other As UnboundGenericType, comparison As TypeCompareKind) As Boolean If Me Is other Then Return True End If Return other IsNot Nothing AndAlso other.GetType() = Me.GetType() AndAlso other.OriginalDefinition.Equals(OriginalDefinition, comparison) End Function Public NotOverridable Overrides Function GetHashCode() As Integer Return Hash.Combine(Me.GetType(), OriginalDefinition.GetHashCode()) End Function Friend Overrides ReadOnly Property CanConstruct As Boolean Get Return False End Get End Property Public Overrides Function Construct(typeArguments As ImmutableArray(Of TypeSymbol)) As NamedTypeSymbol Throw New InvalidOperationException() End Function Friend Overrides ReadOnly Property DefaultPropertyName As String Get ' Properties are not members of UnboundGenericType. Return Nothing End Get End Property Friend MustOverride Overrides ReadOnly Property TypeSubstitution As TypeSubstitution ''' <summary> ''' Force all declaration errors to be generated. ''' </summary> Friend NotOverridable Overrides Sub GenerateDeclarationErrors(cancellationToken As CancellationToken) Throw ExceptionUtilities.Unreachable End Sub Friend NotOverridable Overrides Function GetUnificationUseSiteDiagnosticRecursive(owner As Symbol, ByRef checkedTypes As HashSet(Of TypeSymbol)) As DiagnosticInfo Return Nothing End Function Friend NotOverridable Overrides Function GetFieldsToEmit() As IEnumerable(Of FieldSymbol) Throw ExceptionUtilities.Unreachable End Function Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol) Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)() End Function Friend NotOverridable Overrides ReadOnly Property HasAnyDeclaredRequiredMembers As Boolean Get Return False End Get End Property Friend Overrides Function GetGuidString(ByRef guidString As String) As Boolean Return OriginalDefinition.GetGuidString(guidString) End Function Private NotInheritable Class ConstructedSymbol Inherits UnboundGenericType Private ReadOnly _originalDefinition As NamedTypeSymbol Private _lazyContainingSymbol As Symbol Private _lazyConstructedFrom As NamedTypeSymbol Private _lazyTypeArguments As ImmutableArray(Of TypeSymbol) Private _lazyTypeSubstitution As TypeSubstitution Public Sub New(originalDefinition As NamedTypeSymbol) MyBase.New() Debug.Assert(originalDefinition.IsDefinition) Debug.Assert(originalDefinition.IsGenericType) If originalDefinition.Arity = 0 Then _lazyTypeArguments = ImmutableArray(Of TypeSymbol).Empty End If _originalDefinition = originalDefinition End Sub Public Overrides ReadOnly Property IsUnboundGenericType As Boolean Get Return True End Get End Property Public Overrides ReadOnly Property OriginalDefinition As NamedTypeSymbol Get Return _originalDefinition End Get End Property Public Overrides ReadOnly Property ContainingSymbol As Symbol Get If _lazyContainingSymbol Is Nothing Then Dim result As Symbol Dim originalDefinitionContainingType As NamedTypeSymbol = OriginalDefinition.ContainingType If originalDefinitionContainingType IsNot Nothing Then If originalDefinitionContainingType.IsGenericType Then result = UnboundGenericType.Create(originalDefinitionContainingType) Else result = originalDefinitionContainingType End If Else result = OriginalDefinition.ContainingSymbol End If Interlocked.CompareExchange(_lazyContainingSymbol, result, Nothing) End If Return _lazyContainingSymbol End Get End Property Public Overrides ReadOnly Property ConstructedFrom As NamedTypeSymbol Get If _lazyConstructedFrom Is Nothing Then Dim result As NamedTypeSymbol Dim originalDefinitionContainingType As NamedTypeSymbol = OriginalDefinition.ContainingType If originalDefinitionContainingType Is Nothing OrElse Not originalDefinitionContainingType.IsGenericType Then result = OriginalDefinition ElseIf OriginalDefinition.Arity = 0 Then result = Me Else result = New UnboundGenericType.ConstructedFromSymbol(Me) End If Interlocked.CompareExchange(_lazyConstructedFrom, result, Nothing) End If Return _lazyConstructedFrom End Get End Property Public Overrides ReadOnly Property TypeParameters As ImmutableArray(Of TypeParameterSymbol) Get If OriginalDefinition.Arity = 0 Then Return ImmutableArray(Of TypeParameterSymbol).Empty End If Return Me.ConstructedFrom.TypeParameters End Get End Property Friend Overrides ReadOnly Property TypeArgumentsNoUseSiteDiagnostics As ImmutableArray(Of TypeSymbol) Get If _lazyTypeArguments.IsDefault Then Debug.Assert(OriginalDefinition.Arity > 0) Dim arguments(OriginalDefinition.Arity - 1) As TypeSymbol For i As Integer = 0 To arguments.Length - 1 arguments(i) = UnboundTypeArgument Next ImmutableInterlocked.InterlockedInitialize(_lazyTypeArguments, arguments.AsImmutableOrNull()) End If Return _lazyTypeArguments End Get End Property Friend Overrides ReadOnly Property TypeSubstitution As TypeSubstitution Get If _lazyTypeSubstitution Is Nothing Then Dim result As TypeSubstitution Dim container As Symbol = ContainingSymbol Dim containerAsConstructed = TryCast(container, UnboundGenericType.ConstructedSymbol) Debug.Assert(Not Me.HasTypeArgumentsCustomModifiers) If containerAsConstructed IsNot Nothing Then If OriginalDefinition.Arity = 0 Then result = VisualBasic.Symbols.TypeSubstitution.Concat(OriginalDefinition, containerAsConstructed.TypeSubstitution, Nothing) Else result = VisualBasic.Symbols.TypeSubstitution.Create(containerAsConstructed.TypeSubstitution, OriginalDefinition, Me.TypeArgumentsNoUseSiteDiagnostics) End If Else Debug.Assert(Not (TypeOf container Is NamedTypeSymbol AndAlso DirectCast(container, NamedTypeSymbol).IsGenericType)) result = VisualBasic.Symbols.TypeSubstitution.Create(OriginalDefinition, OriginalDefinition.TypeParameters, Me.TypeArgumentsNoUseSiteDiagnostics) End If Interlocked.CompareExchange(_lazyTypeSubstitution, result, Nothing) End If Return _lazyTypeSubstitution End Get End Property Public Overrides ReadOnly Property MemberNames As IEnumerable(Of String) Get Return New List(Of String)(From t In OriginalDefinition.GetTypeMembersUnordered() Select t.Name Distinct) End Get End Property Public Overrides Function GetMembers() As ImmutableArray(Of Symbol) ' Unbound types contain only types. Dim builder As ArrayBuilder(Of NamedTypeSymbol) = ArrayBuilder(Of NamedTypeSymbol).GetInstance() For Each member In OriginalDefinition.GetMembers() 'Using GetMembers() to enforce declaration order. If member.Kind = SymbolKind.NamedType Then builder.AddRange(DirectCast(member, NamedTypeSymbol)) End If Next Return StaticCast(Of Symbol).From(GetTypeMembers(builder.ToImmutableAndFree())) End Function Public Overrides Function GetMembers(name As String) As ImmutableArray(Of Symbol) ' Unbound types contain only types. Return StaticCast(Of Symbol).From(GetTypeMembers(name)) End Function Friend Overrides Function GetTypeMembersUnordered() As ImmutableArray(Of NamedTypeSymbol) Return GetTypeMembers(OriginalDefinition.GetTypeMembersUnordered()) End Function Public Overrides Function GetTypeMembers() As ImmutableArray(Of NamedTypeSymbol) Return GetTypeMembers(OriginalDefinition.GetTypeMembers()) End Function Private Overloads Shared Function GetTypeMembers(originalTypeMembers As ImmutableArray(Of NamedTypeSymbol)) As ImmutableArray(Of NamedTypeSymbol) If originalTypeMembers.IsEmpty Then Return originalTypeMembers End If Dim members(originalTypeMembers.Length - 1) As NamedTypeSymbol For i As Integer = 0 To members.Length - 1 members(i) = (New UnboundGenericType.ConstructedSymbol(originalTypeMembers(i))).ConstructedFrom Next Return members.AsImmutableOrNull() End Function Public Overrides Function GetTypeMembers(name As String) As ImmutableArray(Of NamedTypeSymbol) Return GetTypeMembers(OriginalDefinition.GetTypeMembers(name)) End Function Public Overrides Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) Return OriginalDefinition.GetTypeMembers(name, arity).SelectAsArray(Function(t) (New UnboundGenericType.ConstructedSymbol(t)).ConstructedFrom) End Function Friend Overrides Function InternalSubstituteTypeParameters(additionalSubstitution As TypeSubstitution) As TypeWithModifiers ' Has no effect. Return New TypeWithModifiers(Me) End Function End Class Private NotInheritable Class ConstructedFromSymbol Inherits UnboundGenericType Public ReadOnly Constructed As ConstructedSymbol Private ReadOnly _typeParameters As ImmutableArray(Of TypeParameterSymbol) Private ReadOnly _typeSubstitution As TypeSubstitution Public Sub New(constructed As ConstructedSymbol) MyBase.New() Dim originalDefinition As NamedTypeSymbol = constructed.OriginalDefinition Debug.Assert(originalDefinition.Arity > 0) Me.Constructed = constructed Dim typeParametersDefinitions As ImmutableArray(Of TypeParameterSymbol) = originalDefinition.TypeParameters Dim alphaRenamedTypeParameters = New SubstitutedTypeParameterSymbol(typeParametersDefinitions.Length - 1) {} For i As Integer = 0 To typeParametersDefinitions.Length - 1 Step 1 alphaRenamedTypeParameters(i) = New SubstitutedTypeParameterSymbol(typeParametersDefinitions(i)) Next Dim newTypeParameters = alphaRenamedTypeParameters.AsImmutableOrNull() Dim container = DirectCast(constructed.ContainingSymbol, ConstructedSymbol) _typeParameters = StaticCast(Of TypeParameterSymbol).From(newTypeParameters) ' Add a substitution to map from type parameter definitions to corresponding ' alpha-renamed type parameters. Dim substitution = VisualBasic.Symbols.TypeSubstitution.CreateForAlphaRename(container.TypeSubstitution, newTypeParameters) Debug.Assert(substitution.TargetGenericDefinition Is originalDefinition) ' Set container for type parameters For Each param In alphaRenamedTypeParameters param.SetContainingSymbol(Me) Next _typeSubstitution = substitution End Sub Public Overrides ReadOnly Property IsUnboundGenericType As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property OriginalDefinition As NamedTypeSymbol Get Return Constructed.OriginalDefinition End Get End Property Public Overrides ReadOnly Property ConstructedFrom As NamedTypeSymbol Get Return Me End Get End Property Public Overrides ReadOnly Property ContainingSymbol As Symbol Get Return Constructed.ContainingSymbol End Get End Property Public Overrides ReadOnly Property TypeParameters As ImmutableArray(Of TypeParameterSymbol) Get Return _typeParameters End Get End Property Friend Overrides ReadOnly Property TypeArgumentsNoUseSiteDiagnostics As ImmutableArray(Of TypeSymbol) Get Return StaticCast(Of TypeSymbol).From(_typeParameters) End Get End Property Friend Overrides ReadOnly Property TypeSubstitution As TypeSubstitution Get Return _typeSubstitution End Get End Property Public Overrides ReadOnly Property MemberNames As IEnumerable(Of String) Get Return SpecializedCollections.EmptyCollection(Of String)() End Get End Property Public Overrides Function GetMembers() As ImmutableArray(Of Symbol) Return ImmutableArray(Of Symbol).Empty End Function Public Overrides Function GetMembers(name As String) As ImmutableArray(Of Symbol) Return ImmutableArray(Of Symbol).Empty End Function 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 Friend Overrides Function InternalSubstituteTypeParameters(additionalSubstitution As TypeSubstitution) As TypeWithModifiers Throw ExceptionUtilities.Unreachable End Function End Class End Class End Namespace