|
' 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.Composition
Imports System.Threading
Imports Microsoft.CodeAnalysis.Host
Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.LanguageService
Imports Microsoft.CodeAnalysis.Operations
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery
Imports Microsoft.CodeAnalysis.VisualBasic.LanguageService
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic
<ExportLanguageServiceFactory(GetType(ISemanticFactsService), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicSemanticFactsServiceFactory
Implements ILanguageServiceFactory
<ImportingConstructor>
<Obsolete(MefConstruction.ImportingConstructorMessage, True)>
Public Sub New()
End Sub
Public Function CreateLanguageService(languageServices As HostLanguageServices) As ILanguageService Implements ILanguageServiceFactory.CreateLanguageService
Return VisualBasicSemanticFactsService.Instance
End Function
End Class
Partial Friend NotInheritable Class VisualBasicSemanticFactsService
Inherits AbstractSemanticFactsService
Implements ISemanticFactsService
Public Shared ReadOnly Instance As New VisualBasicSemanticFactsService()
Public Overrides ReadOnly Property SyntaxFacts As ISyntaxFacts = VisualBasicSyntaxFacts.Instance
Public Overrides ReadOnly Property BlockFacts As IBlockFacts = VisualBasicBlockFacts.Instance
Protected Overrides ReadOnly Property SemanticFacts As ISemanticFacts = VisualBasicSemanticFacts.Instance
Private Sub New()
End Sub
Protected Overrides Function ToIdentifierToken(identifier As String) As SyntaxToken
Return identifier.ToIdentifierToken
End Function
Public Function IsExpressionContext(semanticModel As SemanticModel,
position As Integer,
cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsExpressionContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsExpressionContext(position, token, cancellationToken, semanticModel)
End Function
Public Function IsMemberDeclarationContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsMemberDeclarationContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsInterfaceMemberDeclarationKeywordContext(position, token, cancellationToken) OrElse
semanticModel.SyntaxTree.IsTypeMemberDeclarationKeywordContext(position, token, cancellationToken)
End Function
Public Function IsNamespaceContext(semanticModel As SemanticModel,
position As Integer,
cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsNamespaceContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsNamespaceContext(position, token, cancellationToken, semanticModel)
End Function
Public Function IsStatementContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsStatementContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsSingleLineStatementContext(position, token, cancellationToken) OrElse
semanticModel.SyntaxTree.IsMultiLineStatementStartContext(position, token, cancellationToken)
End Function
Public Function IsTypeContext(semanticModel As SemanticModel,
position As Integer,
cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsTypeContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsTypeContext(position, token, cancellationToken, semanticModel)
End Function
Public Function IsTypeDeclarationContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsTypeDeclarationContext
Dim token = semanticModel.SyntaxTree.GetTargetToken(position, cancellationToken)
Return semanticModel.SyntaxTree.IsTypeDeclarationContext(position, token, cancellationToken)
End Function
Public Function IsGlobalStatementContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsGlobalStatementContext
Return False
End Function
Public Function IsLabelContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsLabelContext
Dim tree = semanticModel.SyntaxTree
Dim token = tree.GetTargetToken(position, cancellationToken)
Return tree.IsLabelContext(position, token, cancellationToken)
End Function
Public Function IsAttributeNameContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsAttributeNameContext
Dim tree = semanticModel.SyntaxTree
Dim token = tree.GetTargetToken(position, cancellationToken)
Return tree.IsAttributeNameContext(position, token, cancellationToken)
End Function
Public Function IsNamespaceDeclarationNameContext(semanticModel As SemanticModel, position As Integer, cancellationToken As CancellationToken) As Boolean Implements ISemanticFactsService.IsNamespaceDeclarationNameContext
Return semanticModel.SyntaxTree.IsNamespaceDeclarationNameContext(position, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(
semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(semanticModel, location, containerOpt, baseName, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(
semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, usedNames As IEnumerable(Of String), cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(semanticModel, location, containerOpt, baseName, usedNames, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueLocalName(
semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueLocalName
Return MyBase.GenerateUniqueLocalName(semanticModel, location, containerOpt, baseName, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueLocalName(
semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, usedName As IEnumerable(Of String), cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueLocalName
Return MyBase.GenerateUniqueLocalName(semanticModel, location, containerOpt, baseName, usedName, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(semanticModel As SemanticModel, location As SyntaxNode, containerOpt As SyntaxNode, baseName As String, filter As Func(Of ISymbol, Boolean), usedNames As IEnumerable(Of String), cancellationToken As CancellationToken) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(semanticModel, location, containerOpt, baseName, filter, usedNames, cancellationToken)
End Function
Private Function ISemanticFactsService_GenerateUniqueName(baseName As String, usedNames As IEnumerable(Of String)) As SyntaxToken Implements ISemanticFactsService.GenerateUniqueName
Return MyBase.GenerateUniqueName(baseName, usedNames)
End Function
Public Function ClassifyConversion(semanticModel As SemanticModel, expression As SyntaxNode, destination As ITypeSymbol) As CommonConversion Implements ISemanticFactsService.ClassifyConversion
Return semanticModel.ClassifyConversion(DirectCast(expression, ExpressionSyntax), destination).ToCommonConversion()
End Function
Public Function TryGetDisposeMethod(semanticModel As SemanticModel, node As SyntaxNode, cancellationToken As CancellationToken) As IMethodSymbol Implements ISemanticFactsService.TryGetDisposeMethod
Dim usingStatement = If(TryCast(node, UsingBlockSyntax)?.UsingStatement, TryCast(node, UsingStatementSyntax))
If usingStatement Is Nothing Then
Return Nothing
End If
Dim expression As ExpressionSyntax
If usingStatement.Variables.Count > 0 Then
expression = usingStatement.Variables(0).Initializer?.Value
Else
expression = usingStatement.Expression
End If
If expression Is Nothing Then
Return Nothing
End If
Dim type = semanticModel.GetTypeInfo(expression, cancellationToken).Type
Return FindDisposeMethod(semanticModel.Compilation, type, isAsync:=False)
End Function
End Class
End Namespace
|