File: Syntax\VisualBasicSyntaxTree.ParsedSyntaxTree.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
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Imports Microsoft.CodeAnalysis.Text
 
Namespace Microsoft.CodeAnalysis.VisualBasic
 
    Partial Public Class VisualBasicSyntaxTree
 
        ''' <summary>
        ''' A SyntaxTree is a tree of nodes that represents an entire file of VB
        ''' code, and is parsed by the parser.
        ''' </summary>
        Partial Private Class ParsedSyntaxTree
            Inherits VisualBasicSyntaxTree
 
            Private ReadOnly _options As VisualBasicParseOptions
            Private ReadOnly _path As String
            Private ReadOnly _root As VisualBasicSyntaxNode
            Private ReadOnly _hasCompilationUnitRoot As Boolean
            Private ReadOnly _isMyTemplate As Boolean
            Private ReadOnly _encodingOpt As Encoding
            Private ReadOnly _checksumAlgorithm As SourceHashAlgorithm
            Private ReadOnly _diagnosticOptions As ImmutableDictionary(Of String, ReportDiagnostic)
 
            Private _lazyText As SourceText
 
            ''' <summary>
            ''' Used to create new tree incrementally.
            ''' </summary>
            Friend Sub New(textOpt As SourceText,
                           encodingOpt As Encoding,
                           checksumAlgorithm As SourceHashAlgorithm,
                           path As String,
                           options As VisualBasicParseOptions,
                           syntaxRoot As VisualBasicSyntaxNode,
                           isMyTemplate As Boolean,
                           diagnosticOptions As ImmutableDictionary(Of String, ReportDiagnostic),
                           Optional cloneRoot As Boolean = True)
 
                Debug.Assert(syntaxRoot IsNot Nothing)
                Debug.Assert(options IsNot Nothing)
                Debug.Assert(textOpt Is Nothing OrElse textOpt.Encoding Is encodingOpt AndAlso textOpt.ChecksumAlgorithm = checksumAlgorithm)
                Debug.Assert(SourceHashAlgorithms.IsSupportedAlgorithm(checksumAlgorithm))
 
                _lazyText = textOpt
                _encodingOpt = If(encodingOpt, textOpt?.Encoding)
                _checksumAlgorithm = checksumAlgorithm
                _options = options
                _path = If(path, String.Empty)
                _root = If(cloneRoot, Me.CloneNodeAsRoot(syntaxRoot), syntaxRoot)
                _hasCompilationUnitRoot = (syntaxRoot.Kind = SyntaxKind.CompilationUnit)
                _isMyTemplate = isMyTemplate
 
                _diagnosticOptions = If(diagnosticOptions, EmptyDiagnosticOptions)
            End Sub
 
            Public Overrides ReadOnly Property FilePath As String
                Get
                    Return _path
                End Get
            End Property
 
            Friend Overrides ReadOnly Property IsMyTemplate As Boolean
                Get
                    Return _isMyTemplate
                End Get
            End Property
 
            Public Overrides Function GetText(Optional cancellationToken As CancellationToken = Nothing) As SourceText
                If _lazyText Is Nothing Then
                    Dim treeText = Me.GetRoot(cancellationToken).GetText(_encodingOpt, _checksumAlgorithm)
                    Interlocked.CompareExchange(_lazyText, treeText, Nothing)
                End If
 
                Return _lazyText
            End Function
 
            Public Overrides Function TryGetText(ByRef text As SourceText) As Boolean
                text = _lazyText
                Return text IsNot Nothing
            End Function
 
            Public Overrides ReadOnly Property Encoding As Encoding
                Get
                    Return _encodingOpt
                End Get
            End Property
 
            Public Overrides ReadOnly Property Length As Integer
                Get
                    Return _root.FullSpan.Length
                End Get
            End Property
 
            Public Overrides Function GetRoot(Optional cancellationToken As CancellationToken = Nothing) As VisualBasicSyntaxNode
                Return _root
            End Function
 
            Public Overrides Function GetRootAsync(Optional cancellationToken As CancellationToken = Nothing) As Task(Of VisualBasicSyntaxNode)
                Return Task.FromResult(_root)
            End Function
 
            Public Overrides Function TryGetRoot(ByRef root As VisualBasicSyntaxNode) As Boolean
                root = _root
                Return True
            End Function
 
            Public Overrides ReadOnly Property HasCompilationUnitRoot As Boolean
                Get
                    Return _hasCompilationUnitRoot
                End Get
            End Property
 
            Public Overrides ReadOnly Property Options As VisualBasicParseOptions
                Get
                    Return _options
                End Get
            End Property
 
            Public Overrides ReadOnly Property DiagnosticOptions As ImmutableDictionary(Of String, ReportDiagnostic)
                Get
                    Return _diagnosticOptions
                End Get
            End Property
 
            ''' <summary>
            ''' Get a reference to the given node.
            ''' </summary>
            Public Overrides Function GetReference(node As SyntaxNode) As SyntaxReference
                Return New SimpleSyntaxReference(Me, node)
            End Function
 
            Public Overrides Function WithRootAndOptions(root As SyntaxNode, options As ParseOptions) As SyntaxTree
                If _root Is root AndAlso _options Is options Then
                    Return Me
                End If
 
                Return New ParsedSyntaxTree(
                    Nothing,
                    _encodingOpt,
                    _checksumAlgorithm,
                    _path,
                    DirectCast(options, VisualBasicParseOptions),
                    DirectCast(root, VisualBasicSyntaxNode),
                    _isMyTemplate,
                    _diagnosticOptions,
                    cloneRoot:=True)
            End Function
 
            Public Overrides Function WithFilePath(path As String) As SyntaxTree
                If String.Equals(Me._path, path) Then
                    Return Me
                End If
 
                Return New ParsedSyntaxTree(
                    _lazyText,
                    _encodingOpt,
                    _checksumAlgorithm,
                    path,
                    _options,
                    _root,
                    _isMyTemplate,
                    _diagnosticOptions,
                    cloneRoot:=True)
            End Function
 
            Public Overrides Function WithDiagnosticOptions(options As ImmutableDictionary(Of String, ReportDiagnostic)) As SyntaxTree
                If options Is Nothing Then
                    options = EmptyDiagnosticOptions
                End If
 
                If ReferenceEquals(_diagnosticOptions, options) Then
                    Return Me
                End If
 
                Return New ParsedSyntaxTree(_lazyText,
                                            _encodingOpt,
                                            _checksumAlgorithm,
                                            _path,
                                            _options,
                                            _root,
                                            _isMyTemplate,
                                            options,
                                            cloneRoot:=True)
            End Function
        End Class
    End Class
End Namespace