File: Symbols\Source\SynthesizedInteractiveInitializerMethod.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
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
 
    Friend NotInheritable Class SynthesizedInteractiveInitializerMethod
        Inherits SynthesizedMethodBase
 
        Friend Const InitializerName = "<Initialize>"
 
        Friend ReadOnly ResultType As TypeSymbol
        Friend ReadOnly FunctionLocal As LocalSymbol
        Friend ReadOnly ExitLabel As LabelSymbol
 
        Private ReadOnly _syntaxReference As SyntaxReference
        Private ReadOnly _returnType As TypeSymbol
 
        Friend Sub New(
            syntaxReference As SyntaxReference,
            containingType As SourceMemberContainerTypeSymbol,
            diagnostics As BindingDiagnosticBag)
            MyBase.New(containingType)
 
            _syntaxReference = syntaxReference
            CalculateReturnType(containingType.DeclaringCompilation, diagnostics, ResultType, _returnType)
            FunctionLocal = New SynthesizedLocal(Me, ResultType, SynthesizedLocalKind.FunctionReturnValue, Syntax)
            ExitLabel = New GeneratedLabelSymbol("exit")
        End Sub
 
        Public Overrides ReadOnly Property Name As String
            Get
                Return InitializerName
            End Get
        End Property
 
        Friend Overrides ReadOnly Property IsScriptInitializer As Boolean
            Get
                Return True
            End Get
        End Property
 
        Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility
            Get
                Return Accessibility.Friend
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsAsync As Boolean
            Get
                Return True
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsMustOverride As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsNotOverridable As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverloads As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverridable As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsOverrides As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsShared As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property IsSub As Boolean
            Get
                Return _returnType.SpecialType = SpecialType.System_Void
            End Get
        End Property
 
        Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location)
            Get
                Return m_containingType.Locations()
            End Get
        End Property
 
        Public Overrides ReadOnly Property MethodKind As MethodKind
            Get
                Return MethodKind.Ordinary
            End Get
        End Property
 
        Public Overrides ReadOnly Property ReturnType As TypeSymbol
            Get
                Return _returnType
            End Get
        End Property
 
        Friend Overrides ReadOnly Property GenerateDebugInfoImpl As Boolean
            Get
                Return True
            End Get
        End Property
 
        Friend Overrides ReadOnly Property HasSpecialName As Boolean
            Get
                Return True
            End Get
        End Property
 
        Friend Overrides ReadOnly Property Syntax As SyntaxNode
            Get
                Return DirectCast(_syntaxReference.GetSyntax(), VisualBasicSyntaxNode)
            End Get
        End Property
 
        Friend Overrides Function GetBoundMethodBody(compilationState As TypeCompilationState, diagnostics As BindingDiagnosticBag, Optional ByRef methodBodyBinder As Binder = Nothing) As BoundBlock
            Dim syntax As SyntaxNode = Me.Syntax
            Return New BoundBlock(
                syntax,
                Nothing,
                ImmutableArray.Create(FunctionLocal),
                ImmutableArray.Create(Of BoundStatement)(New BoundLabelStatement(syntax, ExitLabel)))
        End Function
 
        Friend Overrides Function CalculateLocalSyntaxOffset(localPosition As Integer, localTree As SyntaxTree) As Integer
            Return DirectCast(m_containingType, SourceMemberContainerTypeSymbol).CalculateSyntaxOffsetInSynthesizedConstructor(localPosition, localTree, isShared:=False)
        End Function
 
        Private Shared Sub CalculateReturnType(
            compilation As VisualBasicCompilation,
            diagnostics As BindingDiagnosticBag,
            ByRef resultType As TypeSymbol,
            ByRef returnType As TypeSymbol)
 
            Dim submissionReturnType As Type = Nothing
            If compilation.ScriptCompilationInfo IsNot Nothing Then
                submissionReturnType = compilation.ScriptCompilationInfo.ReturnTypeOpt
            End If
 
            Dim taskT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T)
            diagnostics.Add(taskT.GetUseSiteInfo(), NoLocation.Singleton)
 
            ' If no explicit return type is set on ScriptCompilationInfo, default to
            ' System.Object from the target corlib. This allows cross compiling scripts
            ' to run on a target corlib that may differ from the host compiler's corlib.
            ' cf. https://github.com/dotnet/roslyn/issues/8506
            If submissionReturnType Is Nothing Then
                resultType = compilation.GetSpecialType(SpecialType.System_Object)
            Else
                resultType = compilation.GetTypeByReflectionType(submissionReturnType)
            End If
            returnType = taskT.Construct(resultType)
        End Sub
 
    End Class
 
End Namespace