File: Symbols\Retargeting\RetargetingPropertySymbol.vb
Web Access
Project: src\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.Immutable
Imports System.Globalization
Imports System.Threading
Imports Microsoft.CodeAnalysis.PooledObjects
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Emit
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting
    Friend NotInheritable Class RetargetingPropertySymbol
        Inherits PropertySymbol
 
        ''' <summary>
        ''' Owning RetargetingModuleSymbol.
        ''' </summary>
        Private ReadOnly _retargetingModule As RetargetingModuleSymbol
 
        ''' <summary>
        ''' The underlying PropertySymbol, cannot be another RetargetingPropertySymbol.
        ''' </summary>
        Private ReadOnly _underlyingProperty As PropertySymbol
 
        Private _lazyParameters As ImmutableArray(Of ParameterSymbol)
 
        Private _lazyCustomModifiers As CustomModifiersTuple
 
        ''' <summary>
        ''' Retargeted custom attributes
        ''' </summary>
        ''' <remarks></remarks>
        Private _lazyCustomAttributes As ImmutableArray(Of VisualBasicAttributeData)
 
        Private _lazyExplicitInterfaceImplementations As ImmutableArray(Of PropertySymbol)
 
        Private _lazyCachedUseSiteInfo As CachedUseSiteInfo(Of AssemblySymbol) = CachedUseSiteInfo(Of AssemblySymbol).Uninitialized ' Indicates unknown state. 
 
        Public Sub New(retargetingModule As RetargetingModuleSymbol, underlyingProperty As PropertySymbol)
            Debug.Assert(retargetingModule IsNot Nothing)
            Debug.Assert(underlyingProperty IsNot Nothing)
 
            If TypeOf underlyingProperty Is RetargetingPropertySymbol Then
                Throw New ArgumentException()
            End If
 
            _retargetingModule = retargetingModule
            _underlyingProperty = underlyingProperty
        End Sub
 
        Private ReadOnly Property RetargetingTranslator As RetargetingModuleSymbol.RetargetingSymbolTranslator
            Get
                Return _retargetingModule.RetargetingTranslator
            End Get
        End Property
 
        Public ReadOnly Property UnderlyingProperty As PropertySymbol
            Get
                Return _underlyingProperty
            End Get
        End Property
 
        Public ReadOnly Property RetargetingModule As RetargetingModuleSymbol
            Get
                Return _retargetingModule
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsImplicitlyDeclared As Boolean
            Get
                Return _underlyingProperty.IsImplicitlyDeclared
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsWithEvents As Boolean
            Get
                Return _underlyingProperty.IsWithEvents
            End Get
        End Property
 
        Public Overrides ReadOnly Property ContainingSymbol As Symbol
            Get
                Return RetargetingTranslator.Retarget(_underlyingProperty.ContainingSymbol)
            End Get
        End Property
 
        Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility
            Get
                Return _underlyingProperty.DeclaredAccessibility
            End Get
        End Property
 
        Public Overrides Function GetAttributes() As ImmutableArray(Of VisualBasicAttributeData)
            Return RetargetingTranslator.GetRetargetedAttributes(_underlyingProperty, _lazyCustomAttributes)
        End Function
 
        Friend Overrides Function GetCustomAttributesToEmit(moduleBuilder As PEModuleBuilder) As IEnumerable(Of VisualBasicAttributeData)
            Return RetargetingTranslator.RetargetAttributes(_underlyingProperty.GetCustomAttributesToEmit(moduleBuilder))
        End Function
 
        Public Overrides ReadOnly Property GetMethod As MethodSymbol
            Get
                Return If(_underlyingProperty.GetMethod Is Nothing, Nothing, RetargetingTranslator.Retarget(_underlyingProperty.GetMethod))
            End Get
        End Property
 
        Public Overrides ReadOnly Property SetMethod As MethodSymbol
            Get
                Return If(_underlyingProperty.SetMethod Is Nothing, Nothing, RetargetingTranslator.Retarget(_underlyingProperty.SetMethod))
            End Get
        End Property
 
        Friend Overrides ReadOnly Property AssociatedField As FieldSymbol
            Get
                Return If(_underlyingProperty.AssociatedField Is Nothing, Nothing, RetargetingTranslator.Retarget(_underlyingProperty.AssociatedField))
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsDefault As Boolean
            Get
                Return _underlyingProperty.IsDefault
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsMustOverride As Boolean
            Get
                Return _underlyingProperty.IsMustOverride
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsNotOverridable As Boolean
            Get
                Return _underlyingProperty.IsNotOverridable
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverridable As Boolean
            Get
                Return _underlyingProperty.IsOverridable
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverrides As Boolean
            Get
                Return _underlyingProperty.IsOverrides
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverloads As Boolean
            Get
                Return _underlyingProperty.IsOverloads
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsShared As Boolean
            Get
                Return _underlyingProperty.IsShared
            End Get
        End Property
 
        Public Overrides ReadOnly Property Name As String
            Get
                Return _underlyingProperty.Name
            End Get
        End Property
 
        Public Overrides ReadOnly Property MetadataName As String
            Get
                Return _underlyingProperty.MetadataName
            End Get
        End Property
 
        Friend Overrides ReadOnly Property HasSpecialName As Boolean
            Get
                Return _underlyingProperty.HasSpecialName
            End Get
        End Property
 
        Friend Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData
            Get
                Return _underlyingProperty.ObsoleteAttributeData
            End Get
        End Property
 
        Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location)
            Get
                Return _underlyingProperty.Locations
            End Get
        End Property
 
        Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
            Get
                Return _underlyingProperty.DeclaringSyntaxReferences
            End Get
        End Property
 
        Public Overrides ReadOnly Property Parameters As ImmutableArray(Of ParameterSymbol)
            Get
                If _lazyParameters.IsDefault Then
                    ImmutableInterlocked.InterlockedCompareExchange(_lazyParameters, RetargetParameters(), Nothing)
                End If
 
                Return _lazyParameters
            End Get
        End Property
 
        Public Overrides ReadOnly Property ParameterCount As Integer
            Get
                Return _underlyingProperty.ParameterCount
            End Get
        End Property
 
        Private Function RetargetParameters() As ImmutableArray(Of ParameterSymbol)
            Dim list = _underlyingProperty.Parameters
            Dim count = list.Length
 
            If count = 0 Then
                Return ImmutableArray(Of ParameterSymbol).Empty
            Else
                Dim parameters = New ParameterSymbol(count - 1) {}
 
                For i As Integer = 0 To count - 1
                    parameters(i) = RetargetingParameterSymbol.CreatePropertyParameter(Me, list(i))
                Next
 
                Return parameters.AsImmutableOrNull()
            End If
        End Function
 
        Public Overrides ReadOnly Property ReturnsByRef As Boolean
            Get
                Return _underlyingProperty.ReturnsByRef
            End Get
        End Property
 
        Public Overrides ReadOnly Property Type As TypeSymbol
            Get
                Return RetargetingTranslator.Retarget(_underlyingProperty.Type, RetargetOptions.RetargetPrimitiveTypesByTypeCode)
            End Get
        End Property
 
        Public Overrides ReadOnly Property TypeCustomModifiers As ImmutableArray(Of CustomModifier)
            Get
                Return CustomModifiersTuple.TypeCustomModifiers
            End Get
        End Property
 
        Public Overrides ReadOnly Property RefCustomModifiers As ImmutableArray(Of CustomModifier)
            Get
                Return CustomModifiersTuple.RefCustomModifiers
            End Get
        End Property
 
        Private ReadOnly Property CustomModifiersTuple As CustomModifiersTuple
            Get
                Return RetargetingTranslator.RetargetModifiers(_underlyingProperty.TypeCustomModifiers, _underlyingProperty.RefCustomModifiers, _lazyCustomModifiers)
            End Get
        End Property
 
        Friend Overrides ReadOnly Property CallingConvention As Microsoft.Cci.CallingConvention
            Get
                Return _underlyingProperty.CallingConvention
            End Get
        End Property
 
        Public Overrides ReadOnly Property ExplicitInterfaceImplementations As ImmutableArray(Of PropertySymbol)
            Get
                If _lazyExplicitInterfaceImplementations.IsDefault Then
                    ImmutableInterlocked.InterlockedCompareExchange(
                        _lazyExplicitInterfaceImplementations,
                        Me.RetargetExplicitInterfaceImplementations(),
                        Nothing)
                End If
 
                Return _lazyExplicitInterfaceImplementations
            End Get
        End Property
 
        Private Function RetargetExplicitInterfaceImplementations() As ImmutableArray(Of PropertySymbol)
            Dim impls = Me.UnderlyingProperty.ExplicitInterfaceImplementations
            If impls.IsEmpty Then
                Return impls
            End If
 
            Dim builder = ArrayBuilder(Of PropertySymbol).GetInstance()
            For i = 0 To impls.Length - 1
                Dim retargeted = Me.RetargetingModule.RetargetingTranslator.Retarget(impls(i), PropertySignatureComparer.RetargetedExplicitPropertyImplementationComparer)
                If retargeted IsNot Nothing Then
                    builder.Add(retargeted)
                End If
            Next
 
            Return builder.ToImmutableAndFree()
        End Function
 
        Friend Overrides Function GetUseSiteInfo() As UseSiteInfo(Of AssemblySymbol)
            Dim primaryDependency As AssemblySymbol = Me.PrimaryDependency
 
            If Not _lazyCachedUseSiteInfo.IsInitialized Then
                _lazyCachedUseSiteInfo.Initialize(primaryDependency, CalculateUseSiteInfo())
            End If
 
            Return _lazyCachedUseSiteInfo.ToUseSiteInfo(primaryDependency)
        End Function
 
        Friend Overrides ReadOnly Property IsMyGroupCollectionProperty As Boolean
            Get
                Return _underlyingProperty.IsMyGroupCollectionProperty
            End Get
        End Property
 
        Friend Overrides ReadOnly Property HasRuntimeSpecialName As Boolean
            Get
                Return _underlyingProperty.HasRuntimeSpecialName
            End Get
        End Property
 
        ''' <remarks>
        ''' This is for perf, not for correctness.
        ''' </remarks>
        Friend Overrides ReadOnly Property DeclaringCompilation As VisualBasicCompilation
            Get
                Return Nothing
            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 _underlyingProperty.GetDocumentationCommentXml(preferredCulture, expandIncludes, cancellationToken)
        End Function
 
        Public Overrides ReadOnly Property IsRequired As Boolean
            Get
                Debug.Assert(Not _underlyingProperty.IsRequired)
                Return False
            End Get
        End Property
    End Class
End Namespace