File: Binding\ConstantFieldsInProgress.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 Microsoft.CodeAnalysis.VisualBasic.Symbols
 
Namespace Microsoft.CodeAnalysis.VisualBasic
 
    ''' <summary>
    ''' This is used while computing the values of constant fields.  Since they can depend on each
    ''' other, we need to keep track of which ones we are currently computing in order to avoid (and
    ''' report) cycles.
    ''' </summary>
    Friend NotInheritable Class ConstantFieldsInProgress
 
        Private ReadOnly _fieldOpt As SourceFieldSymbol
        Private ReadOnly _dependencies As Dependencies
 
        Friend Shared ReadOnly Empty As New ConstantFieldsInProgress(Nothing, Nothing)
 
        Friend Sub New(fieldOpt As SourceFieldSymbol, dependencies As Dependencies)
            _fieldOpt = fieldOpt
            _dependencies = dependencies
        End Sub
 
        Public ReadOnly Property IsEmpty As Boolean
            Get
                Return _fieldOpt Is Nothing
            End Get
        End Property
 
        Public Function AnyDependencies() As Boolean
            Return _dependencies.Any()
        End Function
 
        Friend Sub AddDependency(field As SourceFieldSymbol)
            _dependencies.Add(field)
        End Sub
 
#If DEBUG Then
        Friend NotInheritable Class Dependencies
            Private _isFrozen As Boolean
#Else
        Friend Structure Dependencies
#End If
            Private ReadOnly _builder As HashSet(Of SourceFieldSymbol)
 
            Friend Sub New(builder As HashSet(Of SourceFieldSymbol))
                Debug.Assert(builder IsNot Nothing)
                _builder = builder
            End Sub
 
            Friend Sub Add(field As SourceFieldSymbol)
#If DEBUG Then
                Debug.Assert(Not _isFrozen)
#End If
                _builder.Add(field)
            End Sub
 
            Friend Function Any() As Boolean
                Return _builder.Count <> 0
            End Function
 
            <Conditional("DEBUG")>
            Friend Sub Freeze()
#If DEBUG Then
                _isFrozen = True
#End If
            End Sub
 
#If DEBUG Then
        End Class
#Else
        End Structure
#End If
    End Class
End Namespace