/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/EditorFeatures/Test2/Workspaces/TryFindSourceDefinitionTests.vb
265 строк
11 KB
Cyrus Najmabadi
Organize VB imports
27 июн 2025, 21:53
27 июн 2025, 21:53
e9c47fd
Код
Авторство
О чём код?
' 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.Threading Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.FindSymbols Imports Microsoft.CodeAnalysis.Host Imports Xunit.Abstractions Namespace Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces <[UseExportProvider]> Public Class TryFindSourceDefinitionTests Private ReadOnly _outputHelper As ITestOutputHelper Private Shared Function GetProject(snapshot As Solution, assemblyName As String) As Project Return snapshot.Projects.Single(Function(p) p.AssemblyName = assemblyName) End Function Public Sub New(outputHelper As ITestOutputHelper) _outputHelper = outputHelper End Sub Private Function CreateWorkspace(definition As XElement) As EditorTestWorkspace Dim workspace = EditorTestWorkspace.Create(definition, composition:=EditorTestCompositions.EditorFeatures.AddParts(GetType(WorkspaceTestLogger))) workspace.Services.SolutionServices.SetWorkspaceTestOutput(_outputHelper) Return workspace End Function <Fact> Public Async Function TestFindTypeInCSharpToVisualBasicProject() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferences="true"> <ProjectReference>VBAssembly</ProjectReference> <Document> using N; class CSClass { VBClass field; } </Document> </Project> <Project Language="Visual Basic" AssemblyName="VBAssembly" CommonReferences="true"> <Document> namespace N Public Class VBClass End Class End Namespace </Document> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim snapshot = workspace.CurrentSolution Dim Type = (Await GetProject(snapshot, "CSharpAssembly").GetCompilationAsync()).GlobalNamespace.GetTypeMembers("CSClass").Single() Dim field = DirectCast(Type.GetMembers("field").Single(), IFieldSymbol) Dim fieldType = field.Type Assert.Equal(LanguageNames.CSharp, fieldType.Language) Assert.True(fieldType.Locations.All(Function(Loc) Loc.IsInMetadata)) Dim mappedType = Await SymbolFinder.FindSourceDefinitionAsync(fieldType, snapshot, CancellationToken.None) Assert.NotNull(mappedType) Assert.Equal(LanguageNames.VisualBasic, mappedType.Language) Assert.True(mappedType.Locations.All(Function(Loc) Loc.IsInSource)) End Using End Function <Fact> Public Async Function TestFindTypeInVisualBasicToCSharpProject() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferences="true"> <Document> namespace N { public class CSClass { } } </Document> </Project> <Project Language="Visual Basic" AssemblyName="VBAssembly" CommonReferences="true"> <ProjectReference>CSharpAssembly</ProjectReference> <Document> imports N Public Class VBClass Dim field As CSClass End Class </Document> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim snapshot = workspace.CurrentSolution Dim Type = (Await GetProject(snapshot, "VBAssembly").GetCompilationAsync()).GlobalNamespace.GetTypeMembers("VBClass").Single() Dim field = DirectCast(Type.GetMembers("field").Single(), IFieldSymbol) Dim fieldType = field.Type Assert.Equal(LanguageNames.VisualBasic, fieldType.Language) Assert.True(fieldType.Locations.All(Function(Loc) Loc.IsInMetadata)) Dim mappedType = Await SymbolFinder.FindSourceDefinitionAsync(fieldType, snapshot) Assert.NotNull(mappedType) Assert.Equal(LanguageNames.CSharp, mappedType.Language) Assert.True(mappedType.Locations.All(Function(Loc) Loc.IsInSource)) End Using End Function <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1068631")> Public Async Function TestFindMethodInVisualBasicToCSharpPortableProject() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferencesPortable="true"> <Document> namespace N { public class CSClass { public void M(int i) { } } } </Document> </Project> <Project Language="Visual Basic" AssemblyName="VBAssembly" CommonReferences="true"> <ProjectReference>CSharpAssembly</ProjectReference> <Document> </Document> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim compilation = Await GetProject(workspace.CurrentSolution, "VBAssembly").GetCompilationAsync() Dim member = compilation.GlobalNamespace.GetMembers("N").Single().GetTypeMembers("CSClass").Single().GetMembers("M").Single() Assert.Equal(LanguageNames.VisualBasic, member.Language) Assert.True(member.Locations.All(Function(Loc) Loc.IsInMetadata)) Dim mappedMember = Await SymbolFinder.FindSourceDefinitionAsync(member, workspace.CurrentSolution) Assert.NotNull(mappedMember) Assert.Equal(LanguageNames.CSharp, mappedMember.Language) Assert.True(mappedMember.Locations.All(Function(Loc) Loc.IsInSource)) End Using End Function <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/599")> Public Async Function TestFindMethodInVisualBasicToCSharpProject_RefKindRef() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferences="true"> <Document> namespace N { public class CSClass { public void M(ref int i) { } } } </Document> </Project> <Project Language="Visual Basic" AssemblyName="VBAssembly" CommonReferences="true"> <ProjectReference>CSharpAssembly</ProjectReference> <Document> </Document> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim compilation = Await GetProject(workspace.CurrentSolution, "VBAssembly").GetCompilationAsync() Dim member = compilation.GlobalNamespace.GetMembers("N").Single().GetTypeMembers("CSClass").Single().GetMembers("M").Single() Assert.Equal(LanguageNames.VisualBasic, member.Language) Assert.True(member.Locations.All(Function(Loc) Loc.IsInMetadata)) Dim mappedMember = Await SymbolFinder.FindSourceDefinitionAsync(member, workspace.CurrentSolution) Assert.NotNull(mappedMember) Assert.Equal(LanguageNames.CSharp, mappedMember.Language) Assert.True(mappedMember.Locations.All(Function(Loc) Loc.IsInSource)) End Using End Function <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/599")> Public Async Function TestFindMethodInVisualBasicToCSharpProject_RefKindOut() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferences="true"> <Document> namespace N { public class CSClass { public void M(out int i) { } } } </Document> </Project> <Project Language="Visual Basic" AssemblyName="VBAssembly" CommonReferences="true"> <ProjectReference>CSharpAssembly</ProjectReference> <Document> </Document> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim compilation = Await GetProject(workspace.CurrentSolution, "VBAssembly").GetCompilationAsync() Dim member = compilation.GlobalNamespace.GetMembers("N").Single().GetTypeMembers("CSClass").Single().GetMembers("M").Single() Assert.Equal(LanguageNames.VisualBasic, member.Language) Assert.True(member.Locations.All(Function(Loc) Loc.IsInMetadata)) Dim mappedMember = Await SymbolFinder.FindSourceDefinitionAsync(member, workspace.CurrentSolution) Assert.NotNull(mappedMember) Assert.Equal(LanguageNames.CSharp, mappedMember.Language) Assert.True(mappedMember.Locations.All(Function(Loc) Loc.IsInSource)) End Using End Function <Fact> Public Async Function TestFindRetargetedClass() As Task Dim workspaceDefinition = <Workspace> <Project Language="C#" AssemblyName="CSharpAssembly" CommonReferencesPortable="true"> <Document> namespace N { public class CSClass { } } </Document> </Project> <Project Language="C#" AssemblyName="CSharpAssembly2" CommonReferences="true"> <ProjectReference>CSharpAssembly</ProjectReference> </Project> </Workspace> Using workspace = CreateWorkspace(workspaceDefinition) Dim retargetedCompilation = Await GetProject(workspace.CurrentSolution, "CSharpAssembly").GetCompilationAsync() Dim originalClass = retargetedCompilation.GlobalNamespace.GetMembers("N").Single().GetTypeMembers("CSClass").Single() Dim retargetingCompilation = Await GetProject(workspace.CurrentSolution, "CSharpAssembly2").GetCompilationAsync() Dim retargetedClass = retargetingCompilation.GlobalNamespace.GetMembers("N").Single().GetTypeMembers("CSClass").Single() ' The retargeted class should not have the same assembly identity as the originating assembly, but ' should come through the compilation reference Assert.NotEqual(retargetedClass.ContainingAssembly, retargetedCompilation.Assembly) Assert.IsAssignableFrom(Of CompilationReference)(retargetingCompilation.GetMetadataReference(retargetedClass.ContainingAssembly)) Dim mappedMember = Await SymbolFinder.FindSourceDefinitionAsync(retargetedClass, workspace.CurrentSolution) Assert.Equal(Of ISymbol)(originalClass, mappedMember) End Using End Function End Class End Namespace