File: Symbols\HandledEvent.vb
Web Access
Project: src\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.Threading
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic

    ''' <summary>
    ''' represents a single item in Handles list.
    ''' </summary>
    Public NotInheritable Class HandledEvent
        Friend Sub New(kind As HandledEventKind,
                       eventSymbol As EventSymbol,
                       withEventsContainerOpt As PropertySymbol,
                       withEventsSourcePropertyOpt As PropertySymbol,
                       delegateCreation As BoundExpression,
                       hookupMethod As MethodSymbol)

            Me._kind = kind

            Debug.Assert(eventSymbol IsNot Nothing)
            Me._eventSymbol = eventSymbol

            Debug.Assert((withEventsContainerOpt Is Nothing) Or kind = HandledEventKind.WithEvents)
            Me._WithEventsContainerOpt = withEventsContainerOpt

            Me._WithEventsSourcePropertyOpt = withEventsSourcePropertyOpt

            Me.delegateCreation = delegateCreation
            Me.hookupMethod = hookupMethod
        End Sub

        ' kind of Handles
        Private ReadOnly _kind As HandledEventKind

        ' E1 in  "Handles obj.E1"
        Private ReadOnly _eventSymbol As EventSymbol

        ' obj in  "Handles obj.E1"
        ' only makes sense when kind is WithEvents. 
        Private ReadOnly _WithEventsContainerOpt As PropertySymbol

        ' P1 in  "Handles obj.P1.E1"
        ' only makes sense when kind is WithEvents. 
        Private ReadOnly _WithEventsSourcePropertyOpt As PropertySymbol

        ''' <summary>
        ''' Kind of Handles event container. (Me, MyBase, MyClass or a WithEvents variable)
        ''' </summary>
        Public ReadOnly Property HandlesKind As HandledEventKind
            Get
                Return _kind
            End Get
        End Property

        ''' <summary>
        ''' Symbol for the event handled in current Handles item.
        ''' </summary>
        Public ReadOnly Property EventSymbol As IEventSymbol
            Get
                Return _eventSymbol
            End Get
        End Property

        Public ReadOnly Property EventContainer As IPropertySymbol
            Get
                Return _WithEventsContainerOpt
            End Get
        End Property

        Public ReadOnly Property WithEventsSourceProperty As IPropertySymbol
            Get
                Return _WithEventsSourcePropertyOpt
            End Get
        End Property

        ' delegate creation expression used to hook/unhook handlers
        ' note that it may contain relaxation lambdas and will need to be injected 
        ' into the host method before lowering.
        ' Used in rewriter.
        Friend ReadOnly delegateCreation As BoundExpression

        ' this is the host method into which hookups will be injected
        ' Used in rewriter.
        Friend ReadOnly hookupMethod As MethodSymbol
    End Class

    ''' <summary>
    ''' Kind of a Handles item represented by a HandledEvent
    ''' </summary>
    Public Enum HandledEventKind
        ''' <summary>
        ''' Handles Me.Event1
        ''' </summary>
        [Me] = 0

        ''' <summary>
        ''' Handles MyClass.Event1
        ''' </summary>
        [MyClass] = 1

        ''' <summary>
        ''' Handles MyBase.Event1
        ''' </summary>
        [MyBase] = 2

        ''' <summary>
        ''' Handles SomeWithEventsVariable.Event1
        ''' </summary>
        [WithEvents] = 3
    End Enum

End Namespace