File: Rewriters\PlaceholderLocalRewriter.vb
Web Access
Project: src\src\ExpressionEvaluator\VisualBasic\Source\ExpressionCompiler\Microsoft.CodeAnalysis.VisualBasic.ExpressionCompiler.vbproj (Microsoft.CodeAnalysis.VisualBasic.ExpressionCompiler)
' 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.ExpressionEvaluator
 
    Friend NotInheritable Class PlaceholderLocalRewriter
        Inherits BoundTreeRewriterWithStackGuardWithoutRecursionOnTheLeftOfBinaryOperator
 
        Friend Shared Function Rewrite(compilation As VisualBasicCompilation, container As EENamedTypeSymbol, node As BoundNode, diagnostics As DiagnosticBag) As BoundNode
            Dim rewriter As New PlaceholderLocalRewriter(compilation, container, diagnostics)
            Return rewriter.Visit(node)
        End Function
 
        Private ReadOnly _compilation As VisualBasicCompilation
        Private ReadOnly _container As EENamedTypeSymbol
        Private ReadOnly _diagnostics As DiagnosticBag
 
        Private Sub New(compilation As VisualBasicCompilation, container As EENamedTypeSymbol, diagnostics As DiagnosticBag)
            _compilation = compilation
            _container = container
            _diagnostics = diagnostics
        End Sub
 
        Public Overrides Function VisitLocal(node As BoundLocal) As BoundNode
            Dim result = RewriteLocal(node, _diagnostics)
            Debug.Assert(TypeSymbol.Equals(result.Type, node.Type, TypeCompareKind.ConsiderEverything))
            Debug.Assert(result.IsLValue = node.IsLValue)
            Return result
        End Function
 
        Private Function RewriteLocal(node As BoundLocal, diagnostics As DiagnosticBag) As BoundExpression
            Dim local = node.LocalSymbol
            If local.DeclarationKind = LocalDeclarationKind.ImplicitVariable Then
                Return ObjectIdLocalSymbol.RewriteLocal(_compilation, _container, node.Syntax, local, node.IsLValue)
            End If
            Dim placeholder = TryCast(local, PlaceholderLocalSymbol)
            If placeholder IsNot Nothing Then
                Return placeholder.RewriteLocal(_compilation, _container, node.Syntax, node.IsLValue, diagnostics)
            End If
            Return node
        End Function
 
    End Class
End Namespace