File: Analysis\FlowAnalysis\EntryPointsWalker.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.Generic
Imports System.Linq
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic
 
    ''' <summary>
    ''' A region analysis walker that records jumps into the region.  Works by overriding NoteBranch, which is
    ''' invoked by a superclass when the two endpoints of a jump have been identified.
    ''' </summary>
    ''' <remarks></remarks>
    Friend Class EntryPointsWalker
        Inherits AbstractRegionControlFlowPass
 
        Friend Overloads Shared Function Analyze(info As FlowAnalysisInfo, region As FlowAnalysisRegionInfo, ByRef succeeded As Boolean?) As IEnumerable(Of LabelStatementSyntax)
            Dim walker = New EntryPointsWalker(info, region)
            Try
                succeeded = walker.Analyze()
                Return If(succeeded, walker._entryPoints, SpecializedCollections.EmptyEnumerable(Of LabelStatementSyntax)())
            Finally
                walker.Free()
            End Try
        End Function
 
        Private ReadOnly _entryPoints As HashSet(Of LabelStatementSyntax) = New HashSet(Of LabelStatementSyntax)()
 
        Private Overloads Function Analyze() As Boolean
            '  We only need to scan in a single pass.
            Return Scan()
        End Function
 
        Private Sub New(info As FlowAnalysisInfo, region As FlowAnalysisRegionInfo)
            MyBase.New(info, region)
        End Sub
 
        Protected Overrides Sub Free()
            MyBase.Free()
        End Sub
 
        Protected Overrides Sub NoteBranch(pending As PendingBranch, stmt As BoundStatement, labelStmt As BoundLabelStatement)
            If stmt.Syntax IsNot Nothing AndAlso labelStmt.Syntax IsNot Nothing AndAlso IsInsideRegion(labelStmt.Syntax.Span) AndAlso Not IsInsideRegion(stmt.Syntax.Span) Then
                Select Case stmt.Kind
                    Case BoundKind.GotoStatement
                        _entryPoints.Add(DirectCast(labelStmt.Syntax, LabelStatementSyntax))
 
                    Case BoundKind.ReturnStatement
                        ' Do nothing
 
                    Case Else
                        Throw ExceptionUtilities.UnexpectedValue(stmt.Kind)
                End Select
            End If
        End Sub
 
    End Class
 
End Namespace