File: Symbols\SubstitutedEventSymbol.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.Globalization
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
    Friend NotInheritable Class SubstitutedEventSymbol
        Inherits EventSymbol

        Private ReadOnly _originalDefinition As EventSymbol
        Private ReadOnly _containingType As SubstitutedNamedType

        Private ReadOnly _addMethod As SubstitutedMethodSymbol
        Private ReadOnly _removeMethod As SubstitutedMethodSymbol
        Private ReadOnly _raiseMethod As SubstitutedMethodSymbol

        Private ReadOnly _associatedField As SubstitutedFieldSymbol

        Private _lazyType As TypeSymbol

        'we want to compute this lazily since it may be expensive for the underlying symbol
        Private _lazyExplicitInterfaceImplementations As ImmutableArray(Of EventSymbol)
        Private _lazyOverriddenOrHiddenMembers As OverriddenMembersResult(Of EventSymbol)

        Friend Sub New(containingType As SubstitutedNamedType,
                       originalDefinition As EventSymbol,
                       addMethod As SubstitutedMethodSymbol,
                       removeMethod As SubstitutedMethodSymbol,
                       raiseMethod As SubstitutedMethodSymbol,
                       associatedField As SubstitutedFieldSymbol)

            Me._containingType = containingType
            Me._originalDefinition = originalDefinition
            Me._associatedField = associatedField

            If addMethod IsNot Nothing Then
                addMethod.SetAssociatedPropertyOrEvent(Me)
                _addMethod = addMethod
            End If

            If removeMethod IsNot Nothing Then
                removeMethod.SetAssociatedPropertyOrEvent(Me)
                _removeMethod = removeMethod
            End If

            If raiseMethod IsNot Nothing Then
                raiseMethod.SetAssociatedPropertyOrEvent(Me)
                _raiseMethod = raiseMethod
            End If
        End Sub

        Friend ReadOnly Property TypeSubstitution As TypeSubstitution
            Get
                Return _containingType.TypeSubstitution
            End Get
        End Property

        Public Overrides ReadOnly Property Type As TypeSymbol
            Get
                If Me._lazyType Is Nothing Then
                    Interlocked.CompareExchange(Me._lazyType,
                                                _originalDefinition.Type.InternalSubstituteTypeParameters(TypeSubstitution).AsTypeSymbolOnly(),
                                                Nothing)
                End If

                Return Me._lazyType
            End Get

        End Property

        Public Overrides ReadOnly Property Name As String
            Get
                Return Me.OriginalDefinition.Name
            End Get
        End Property

        Friend Overrides ReadOnly Property HasSpecialName As Boolean
            Get
                Return Me._originalDefinition.HasSpecialName
            End Get
        End Property

        Public Overrides ReadOnly Property ContainingSymbol As Symbol
            Get
                Return Me._containingType
            End Get
        End Property

        Public Overrides ReadOnly Property ContainingType As NamedTypeSymbol
            Get
                Return Me._containingType
            End Get
        End Property

        Public Overrides ReadOnly Property OriginalDefinition As EventSymbol
            Get
                Return Me._originalDefinition
            End Get
        End Property

        Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location)
            Get
                Return Me._originalDefinition.Locations
            End Get
        End Property

        Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
            Get
                Return Me._originalDefinition.DeclaringSyntaxReferences
            End Get
        End Property

        Public Overrides Function GetAttributes() As ImmutableArray(Of VisualBasicAttributeData)
            Return Me._originalDefinition.GetAttributes()
        End Function

        Public Overrides ReadOnly Property IsShared As Boolean
            Get
                Return Me._originalDefinition.IsShared
            End Get
        End Property

        Public Overrides ReadOnly Property IsNotOverridable As Boolean
            Get
                Return Me._originalDefinition.IsNotOverridable
            End Get
        End Property

        Public Overrides ReadOnly Property IsMustOverride As Boolean
            Get
                Return Me._originalDefinition.IsMustOverride
            End Get
        End Property

        Public Overrides ReadOnly Property IsOverridable As Boolean
            Get
                Return Me._originalDefinition.IsOverridable
            End Get
        End Property

        Public Overrides ReadOnly Property IsOverrides As Boolean
            Get
                Return Me.OriginalDefinition.IsOverrides
            End Get
        End Property

        Public Overrides ReadOnly Property IsImplicitlyDeclared As Boolean
            Get
                Return Me.OriginalDefinition.IsImplicitlyDeclared
            End Get
        End Property

        Public Overrides ReadOnly Property AddMethod As MethodSymbol
            Get
                Return _addMethod
            End Get
        End Property

        Public Overrides ReadOnly Property RemoveMethod As MethodSymbol
            Get
                Return _removeMethod
            End Get
        End Property

        Public Overrides ReadOnly Property RaiseMethod As MethodSymbol
            Get
                Return _raiseMethod
            End Get
        End Property

        Friend Overrides ReadOnly Property AssociatedField As FieldSymbol
            Get
                Return _associatedField
            End Get
        End Property

        Friend Overrides ReadOnly Property IsExplicitInterfaceImplementation As Boolean
            Get
                Return Me._originalDefinition.IsExplicitInterfaceImplementation
            End Get
        End Property

        Public Overrides ReadOnly Property ExplicitInterfaceImplementations As ImmutableArray(Of EventSymbol)
            Get
                If _lazyExplicitInterfaceImplementations.IsDefault Then
                    ImmutableInterlocked.InterlockedCompareExchange(_lazyExplicitInterfaceImplementations,
                                                        ImplementsHelper.SubstituteExplicitInterfaceImplementations(
                                                                                _originalDefinition.ExplicitInterfaceImplementations,
                                                                                TypeSubstitution),
                                                        Nothing)
                End If

                Return _lazyExplicitInterfaceImplementations
            End Get
        End Property

        Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility
            Get
                Return Me.OriginalDefinition.DeclaredAccessibility
            End Get

        End Property

        Friend Overrides ReadOnly Property OverriddenOrHiddenMembers As OverriddenMembersResult(Of EventSymbol)

            Get
                If Me._lazyOverriddenOrHiddenMembers Is Nothing Then
                    Interlocked.CompareExchange(Me._lazyOverriddenOrHiddenMembers,
                                                OverrideHidingHelper(Of EventSymbol).MakeOverriddenMembers(Me),
                                                Nothing)
                End If

                Return Me._lazyOverriddenOrHiddenMembers
            End Get
        End Property

        Friend Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData
            Get
                Return Me.OriginalDefinition.ObsoleteAttributeData
            End Get
        End Property

        Public Overrides ReadOnly Property IsWindowsRuntimeEvent As Boolean
            Get
                Return _originalDefinition.IsWindowsRuntimeEvent
            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
    End Class
End Namespace