File: BoundTree\BoundUserDefinedConversion.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 Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic

    Partial Friend Class BoundUserDefinedConversion

        Public ReadOnly Property Operand As BoundExpression
            Get
                If (InOutConversionFlags And 1) <> 0 Then
                    Return DirectCast([Call].Arguments(0), BoundConversion).Operand
                Else
                    Return [Call].Arguments(0)
                End If
            End Get
        End Property

        Public ReadOnly Property InConversionOpt As BoundConversion
            Get
                If (InOutConversionFlags And 1) <> 0 Then
                    Return DirectCast([Call].Arguments(0), BoundConversion)
                End If

                Return Nothing
            End Get
        End Property

        Public ReadOnly Property OutConversionOpt As BoundConversion
            Get
                If (InOutConversionFlags And 2) <> 0 Then
                    Return DirectCast(UnderlyingExpression, BoundConversion)
                End If

                Return Nothing
            End Get
        End Property

        Public ReadOnly Property [Call] As BoundCall
            Get
                If (InOutConversionFlags And 2) <> 0 Then
                    Return DirectCast(DirectCast(UnderlyingExpression, BoundConversion).Operand, BoundCall)
                End If

                Return DirectCast(UnderlyingExpression, BoundCall)
            End Get
        End Property

#If DEBUG Then
        Private Sub Validate()

            Dim outConversion As BoundConversion = OutConversionOpt
            If outConversion IsNot Nothing Then
                Debug.Assert(Conversions.ConversionExists(outConversion.ConversionKind) AndAlso (outConversion.ConversionKind And ConversionKind.UserDefined) = 0)
            End If

            Dim underlyingCall = [Call]
            Debug.Assert(underlyingCall.Method.MethodKind = MethodKind.Conversion AndAlso underlyingCall.Method.ParameterCount = 1)

            Dim operand As BoundExpression
            Dim inConversion As BoundConversion = InConversionOpt

            If inConversion IsNot Nothing Then
                Debug.Assert(Conversions.ConversionExists(inConversion.ConversionKind) AndAlso (inConversion.ConversionKind And ConversionKind.UserDefined) = 0)
                operand = inConversion.Operand
            Else
                operand = underlyingCall.Arguments(0)
            End If

            Debug.Assert(operand.Type.IsSameTypeIgnoringAll(Type))
        End Sub
#End If

    End Class

End Namespace