| File: Binding\MethodBodySemanticModel.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.Runtime.InteropServices Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic Friend NotInheritable Class MethodBodySemanticModel Inherits MemberSemanticModel Friend Sub New(root As SyntaxNode, binder As Binder, containingPublicSemanticModel As PublicSemanticModel) MyBase.New(root, binder, containingPublicSemanticModel) End Sub ''' <summary> ''' Creates a MethodBodySemanticModel that allows asking semantic questions about an attribute node. ''' </summary> Friend Shared Function Create(containingSemanticModel As SyntaxTreeSemanticModel, binder As SubOrFunctionBodyBinder) As MethodBodySemanticModel Debug.Assert(containingSemanticModel IsNot Nothing) Return New MethodBodySemanticModel(binder.Root, binder, containingSemanticModel) End Function ''' <summary> ''' Creates a speculative semantic model that allows asking semantic questions about an attribute node that did not appear in the original source code. ''' </summary> Friend Shared Function CreateSpeculative(parentSemanticModel As SyntaxTreeSemanticModel, root As VisualBasicSyntaxNode, binder As Binder, position As Integer) As SpeculativeSemanticModelWithMemberModel Return New SpeculativeSemanticModelWithMemberModel(parentSemanticModel, position, root, binder) End Function Friend Overrides Function TryGetSpeculativeSemanticModelForMethodBodyCore(parentModel As SyntaxTreeSemanticModel, position As Integer, method As MethodBlockBaseSyntax, <Out> ByRef speculativeModel As PublicSemanticModel) As Boolean ' CONSIDER: Do we want to ensure that speculated method and the original method have identical signatures? ' Create a speculative binder for the method body. Dim methodSymbol = DirectCast(Me.MemberSymbol, MethodSymbol) Dim containingBinder As Binder = Me.RootBinder ' Get up to the NamedTypeBinder Dim namedTypeBinder As NamedTypeBinder Do namedTypeBinder = TryCast(containingBinder, NamedTypeBinder) If namedTypeBinder IsNot Nothing Then Exit Do End If containingBinder = containingBinder.ContainingBinder Loop Dim methodBodyBinder = BinderBuilder.CreateBinderForMethodBody(methodSymbol, method, SemanticModelBinder.Mark(namedTypeBinder, IgnoresAccessibility)) ' Wrap this binder with a BlockBaseBinder to hold onto the locals declared within the statement. Dim binder = New StatementListBinder(methodBodyBinder, method.Statements) Debug.Assert(binder.IsSemanticModelBinder) speculativeModel = CreateSpeculative(parentModel, method, binder, position) Return True End Function Friend Overrides Function TryGetSpeculativeSemanticModelCore(parentModel As SyntaxTreeSemanticModel, position As Integer, statement As ExecutableStatementSyntax, <Out> ByRef speculativeModel As PublicSemanticModel) As Boolean Dim binder = Me.GetEnclosingBinder(position) If binder Is Nothing Then speculativeModel = Nothing Return False End If ' wrap the binder with a Speculative ExecutableCodeBinder binder = New SpeculativeStatementBinder(statement, binder) ' wrap the binder with a BlockBaseBinder to hold onto the locals declared within the statement Dim statementList = New SyntaxList(Of StatementSyntax)(statement) binder = New StatementListBinder(binder, statementList) speculativeModel = CreateSpeculative(parentModel, statement, binder, position) Return True End Function Friend Overrides Function TryGetSpeculativeSemanticModelCore(parentModel As SyntaxTreeSemanticModel, position As Integer, initializer As EqualsValueSyntax, <Out> ByRef speculativeModel As PublicSemanticModel) As Boolean speculativeModel = Nothing Return False End Function End Class End Namespace