/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Test/Utilities/VisualBasic/SemanticModelTestBase.vb
134 строки
7 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
' 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 Xunit Public MustInherit Class SemanticModelTestBase : Inherits BasicTestBase Protected Function GetNode(compilation As VisualBasicCompilation, treeName As String, textToFind As String) As VisualBasicSyntaxNode Dim tree = CompilationUtils.GetTree(compilation, treeName) Dim node = DirectCast(CompilationUtils.FindTokenFromText(tree, textToFind).Parent, VisualBasicSyntaxNode) Return node End Function Protected Function GetPosition(compilation As VisualBasicCompilation, treeName As String, textToFind As String) As Integer Dim tree = CompilationUtils.GetTree(compilation, treeName) Dim text As String = tree.GetText().ToString() Dim position As Integer = text.IndexOf(textToFind, StringComparison.Ordinal) Return position End Function Protected Function FindBindingText(Of TNode As SyntaxNode)(compilation As Compilation, fileName As String, Optional which As Integer = 0) As TNode Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim bindText As String = Nothing Dim bindPoint = FindBindingTextPosition(compilation, fileName, bindText, which) Dim token As SyntaxToken = tree.GetRoot().FindToken(bindPoint) Dim node = token.Parent While (node IsNot Nothing AndAlso node.ToString <> bindText) node = node.Parent End While Assert.NotNull(node) ' If this trips, then node wasn't found Assert.IsAssignableFrom(GetType(TNode), node) Assert.Equal(bindText, node.ToString()) Return DirectCast(node, TNode) End Function Private Function FindBindingTextPosition(compilation As Compilation, fileName As String, ByRef bindText As String, Optional which As Integer = 0) As Integer Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim bindMarker As String If which > 0 Then bindMarker = "'BIND" & which.ToString() & ":""" Else bindMarker = "'BIND:""" End If Dim text As String = tree.GetRoot().ToFullString() Dim bindCommentIndex As Integer = text.IndexOf(bindMarker, StringComparison.Ordinal) + bindMarker.Length bindText = text.Substring(bindCommentIndex, text.IndexOf(""""c, bindCommentIndex) - bindCommentIndex) Dim bindPoint = text.LastIndexOf(bindText, bindCommentIndex - bindMarker.Length, StringComparison.Ordinal) Return bindPoint End Function Protected Function FindBindingTextPosition(compilation As Compilation, fileName As String) As Integer Dim bindText As String = Nothing Return FindBindingTextPosition(compilation, fileName, bindText) End Function Protected Function FindBindingStartText(Of TNode As SyntaxNode)(compilation As Compilation, fileName As String, Optional which As Integer = 0) As TNode Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim bindText As String = Nothing Dim bindPoint = FindBindingTextPosition(compilation, fileName, bindText, which) Dim token As SyntaxToken = tree.GetRoot().FindToken(bindPoint) Dim node = token.Parent While (node IsNot Nothing AndAlso node.ToString.StartsWith(bindText, StringComparison.Ordinal) AndAlso Not (TypeOf node Is TNode)) node = node.Parent End While Assert.NotNull(node) ' If this trips, then node wasn't found Assert.IsAssignableFrom(GetType(TNode), node) Assert.Contains(bindText, node.ToString(), StringComparison.Ordinal) Return DirectCast(node, TNode) End Function Protected Function GetStartSpanErrorMessage(syntax As SyntaxNode, tpSymbol As ISymbol) As String Return " Syntax.SpanStart : " & syntax.SpanStart & " Location1.SourceSpan.Start : " & tpSymbol.Locations.Item(0).SourceSpan.Start & " Location2.SourceSpan.Start : " & tpSymbol.Locations.Item(0).SourceSpan.Start End Function Friend Function GetAliasInfoForTest(compilation As Compilation, fileName As String, Optional which As Integer = 0) As AliasSymbol Dim node As IdentifierNameSyntax = CompilationUtils.FindBindingText(Of IdentifierNameSyntax)(compilation, fileName, which) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim semanticModel = DirectCast(compilation.GetSemanticModel(tree), VBSemanticModel) Return DirectCast(semanticModel.GetAliasInfo(node), AliasSymbol) End Function Protected Function GetBlockOrStatementInfoForTest(Of StmtSyntax As SyntaxNode)(compilation As Compilation, fileName As String, Optional which As Integer = 0, Optional useParent As Boolean = False) As Object Dim node As SyntaxNode = CompilationUtils.FindBindingText(Of StmtSyntax)(compilation, fileName, which) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim semanticModel = CType(compilation.GetSemanticModel(tree), VBSemanticModel) If useParent Then node = node.Parent End If If TypeOf node Is ForEachStatementSyntax Then Return semanticModel.GetForEachStatementInfo(DirectCast(node, ForEachStatementSyntax)) ElseIf TypeOf node Is ForEachBlockSyntax Then Return semanticModel.GetForEachStatementInfo(DirectCast(node, ForEachBlockSyntax).ForEachStatement) End If Throw New NotSupportedException("Type of syntax node is not supported by GetExtendedSemanticInfoForTest") End Function Friend Function GetLookupNames(compilation As Compilation, filename As String, Optional container As NamespaceOrTypeSymbol = Nothing) As List(Of String) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = filename).Single() Dim binding = DirectCast(compilation.GetSemanticModel(tree), VBSemanticModel) Return binding.LookupNames(FindBindingTextPosition(compilation, "a.vb"), container).ToList() End Function Friend Function GetLookupSymbols(compilation As Compilation, filename As String, Optional container As NamespaceOrTypeSymbol = Nothing, Optional name As String = Nothing, Optional arity As Integer? = Nothing, Optional includeReducedExtensionMethods As Boolean = False, Optional mustBeStatic As Boolean = False) As List(Of ISymbol) Debug.Assert(Not includeReducedExtensionMethods OrElse Not mustBeStatic) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = filename).Single() Dim binding = DirectCast(compilation.GetSemanticModel(tree), VBSemanticModel) Dim anyArity = Not arity.HasValue Dim position = FindBindingTextPosition(compilation, "a.vb") Return If( mustBeStatic, binding.LookupStaticMembers(position, container, name), binding.LookupSymbols(position, container, name, includeReducedExtensionMethods) ).Where(Function(s) anyArity OrElse DirectCast(s, Symbol).GetArity() = arity.Value).ToList() End Function End Class