' 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

        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

            <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


