| File: Lowering\LocalRewriter\LocalRewriter_DelegateCreation.vb | Web Access |
| Project: src\roslyn\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 Microsoft.CodeAnalysis.VisualBasic.Symbols Namespace Microsoft.CodeAnalysis.VisualBasic Partial Friend NotInheritable Class LocalRewriter Public Overrides Function VisitDelegateCreationExpression(node As BoundDelegateCreationExpression) As BoundNode ' if there is a stub needed because of a delegate relaxation, the DelegateCreationNode has ' it stored in RelaxationLambdaOpt. ' The lambda rewriter will then take care of the code generation later on. If node.RelaxationLambdaOpt Is Nothing Then Debug.Assert(node.RelaxationReceiverPlaceholderOpt Is Nothing OrElse Me._inExpressionLambda) Return MyBase.VisitDelegateCreationExpression(node) Else Dim placeholderOpt As BoundRValuePlaceholder = node.RelaxationReceiverPlaceholderOpt Dim captureTemp As SynthesizedLocal = Nothing If placeholderOpt IsNot Nothing Then If Me._inExpressionLambda Then Me.AddPlaceholderReplacement(placeholderOpt, VisitExpression(node.ReceiverOpt)) Else captureTemp = New SynthesizedLocal(Me._currentMethodOrLambda, placeholderOpt.Type, SynthesizedLocalKind.DelegateRelaxationReceiver, syntaxOpt:=placeholderOpt.Syntax) Dim actualReceiver = New BoundLocal(placeholderOpt.Syntax, captureTemp, captureTemp.Type).MakeRValue Me.AddPlaceholderReplacement(placeholderOpt, actualReceiver) End If End If Dim relaxationLambda = DirectCast(Me.Visit(node.RelaxationLambdaOpt), BoundLambda) If placeholderOpt IsNot Nothing Then Me.RemovePlaceholderReplacement(placeholderOpt) End If Dim result As BoundExpression = New BoundConversion( relaxationLambda.Syntax, relaxationLambda, ConversionKind.Lambda Or ConversionKind.Widening, checked:=False, explicitCastInCode:=False, Type:=node.Type, hasErrors:=node.HasErrors) If captureTemp IsNot Nothing Then Dim receiverToCapture As BoundExpression = VisitExpressionNode(node.ReceiverOpt) Dim capture = New BoundAssignmentOperator(receiverToCapture.Syntax, New BoundLocal(receiverToCapture.Syntax, captureTemp, captureTemp.Type), receiverToCapture.MakeRValue(), suppressObjectClone:=True, Type:=captureTemp.Type) result = New BoundSequence( result.Syntax, ImmutableArray.Create(Of LocalSymbol)(captureTemp), ImmutableArray.Create(Of BoundExpression)(capture), result, result.Type) End If Return result End If End Function End Class End Namespace