File: BoundTree\BoundNode.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.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic
    Partial Friend MustInherit Class BoundNode
        Private ReadOnly _kind As BoundKind
        Private _attributes As BoundNodeAttributes
        Private ReadOnly _syntax As SyntaxNode
 
        <Flags()>
        Private Enum BoundNodeAttributes As Byte
            HasErrors = 1 'NOTE: the bit means "NOT OK". So that default is OK state.
            WasCompilerGenerated = 1 << 1
#If DEBUG Then
            ''' <summary>
            ''' Captures the fact that consumers of the node already checked the state of the WasCompilerGenerated bit.
            ''' Allows to assert on attempts to set WasCompilerGenerated bit after that.
            ''' </summary>
            WasCompilerGeneratedIsChecked = 1 << 2
#End If
        End Enum
 
        Public Sub New(kind As BoundKind, syntax As SyntaxNode)
            ValidateLocationInformation(kind, syntax)
 
            _kind = kind
            _syntax = syntax
        End Sub
 
        Public Sub New(kind As BoundKind, syntax As SyntaxNode, hasErrors As Boolean)
            MyClass.New(kind, syntax)
 
            If hasErrors Then
                _attributes = BoundNodeAttributes.HasErrors
            End If
        End Sub
 
        Protected Sub CopyAttributes(node As BoundNode)
            If node.WasCompilerGenerated Then
                Me.SetWasCompilerGenerated()
            End If
        End Sub
 
        <Conditional("DEBUG")>
        Private Shared Sub ValidateLocationInformation(kind As BoundKind, syntax As SyntaxNode)
            ' We should always have a syntax node and a syntax tree as well, unless it is a hidden sequence point.
            ' If it's a sequence point, it must have a syntax tree to retrieve the file name.
            Debug.Assert(kind = BoundKind.SequencePoint OrElse kind = BoundKind.SequencePointExpression OrElse syntax IsNot Nothing)
        End Sub
 
        Public ReadOnly Property HasErrors As Boolean
            Get
                Return (_attributes And BoundNodeAttributes.HasErrors) <> 0
            End Get
        End Property
 
        ''' <summary>
        ''' The node should not be treated as a direct semantical representation of the syntax it is associated with. 
        ''' Some examples: 
        ''' - implicit call for base constructor is associated with the constructor syntax.
        ''' - code in compiler generated constructor is associated with the type declaration.
        ''' 
        ''' Nodes marked this way are likely to be skipped by SemanticModel, Sequence Point rewriter, etc.
        ''' </summary>
        Public ReadOnly Property WasCompilerGenerated As Boolean
            Get
#If DEBUG Then
                _attributes = _attributes Or BoundNodeAttributes.WasCompilerGeneratedIsChecked
#End If
                Return (_attributes And BoundNodeAttributes.WasCompilerGenerated) <> 0
            End Get
        End Property
 
        Public Sub SetWasCompilerGenerated()
#If DEBUG Then
            Debug.Assert((_attributes And BoundNodeAttributes.WasCompilerGeneratedIsChecked) = 0)
#End If
            _attributes = _attributes Or BoundNodeAttributes.WasCompilerGenerated
        End Sub
 
        Public ReadOnly Property Kind As BoundKind
            Get
                Return _kind
            End Get
        End Property
 
        Public ReadOnly Property Syntax As SyntaxNode
            Get
                Return _syntax
            End Get
        End Property
 
        Public ReadOnly Property SyntaxTree As SyntaxTree
            Get
                Return DirectCast(_syntax.SyntaxTree, VisualBasicSyntaxTree)
            End Get
        End Property
 
        Public Overridable Overloads Function Accept(visitor As BoundTreeVisitor) As BoundNode
            Throw ExceptionUtilities.Unreachable
        End Function
 
#If DEBUG Then
#Disable Warning IDE0051 ' Remove unused private members
        Private Function Dump() As String
#Enable Warning IDE0051 ' Remove unused private members
            Return TreeDumper.DumpCompact(BoundTreeDumperNodeProducer.MakeTree(Me))
        End Function
 
        Public Overloads Function MemberwiseClone(Of T As BoundNode)() As T
            Return DirectCast(Me.MemberwiseClone(), T)
        End Function
#End If
    End Class
 
    ' Indicates how a particular method group or property group was qualified, so that the right
    ' errors/warnings can be generated after overload resolution.
    Friend Enum QualificationKind
        Unqualified             ' Unqualified -- a simple name
        QualifiedViaValue       ' Qualified through an expression that produces a variable or value
        QualifiedViaTypeName    ' Qualified through an expression that was a type name.
        QualifiedViaNamespace   ' Qualified through an expression that was a namespace name.
    End Enum
End Namespace