/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Symbol/CompilationAPITests.vb
226 строк
9 KB
Fred Silberberg
Revert "Revert "Implement GetTypesByMetadataName (#58366)" (#58784)" (#58813)
14 янв 2022, 02:13
Не верифицирован
14 янв 2022, 02:13
f3013fd
Код
Авторство
О чём код?
' 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 Microsoft.CodeAnalysis.Test.Utilities Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class CompilationAPITests Inherits BasicTestBase <Fact()> Public Sub GetTypesByMetadataName_NotInSourceNotInReferences() Dim comp = CreateCompilation("") comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Empty(types) End Sub <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_SingleInSourceNotInReferences(useMetadataReferences As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim referenceComp = CreateCompilation("") Dim source = $"Namespace N {accessibility} Class C(Of T) End Class End Namespace" Dim comp = CreateCompilation(source, {If(useMetadataReferences, referenceComp.ToMetadataReference(), referenceComp.EmitToImageReference())}) comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Single(types) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) End Sub <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_MultipleInSourceNotInReferences(useMetadataReferences As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim referenceComp = CreateCompilation("") Dim source = $"Namespace N {accessibility} Class C(Of T) End Class {accessibility} Class C(Of T) End Class End Namespace" Dim comp = CreateCompilation(source, {If(useMetadataReferences, referenceComp.ToMetadataReference(), referenceComp.EmitToImageReference())}) comp.AssertTheseDiagnostics( <expected> BC30179: class 'C' and class 'C' conflict in namespace 'N'. <%= accessibility %> Class C(Of T) ~ </expected>) Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Single(types) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) Assert.Equal(2, types(0).Locations.Length) End Sub <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_SingleInSourceSingleInReferences(useMetadataReference As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim source = $"Namespace N {accessibility} Class C(Of T) End Class End Namespace" Dim referenceComp = CreateCompilation(source) Dim reference As MetadataReference = If(useMetadataReference, referenceComp.ToMetadataReference(), referenceComp.EmitToImageReference()) Dim comp = CreateCompilation(source, {reference}) comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Equal(2, types.Length) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) Assert.Same(comp.Assembly, types(0).ContainingAssembly) AssertEx.Equal("N.C(Of T)", types(1).ToTestDisplayString()) Dim referenceAssembly = comp.GetAssemblyOrModuleSymbol(reference) Assert.Same(types(1).ContainingAssembly, referenceAssembly) End Sub <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_NotInSourceSingleInReferences(useMetadataReference As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim source = $"Namespace N {accessibility} Class C(Of T) End Class End Namespace" Dim referenceComp = CreateCompilation(source) Dim reference As MetadataReference = GetReference(useMetadataReference, referenceComp) Dim comp = CreateCompilation("", {reference}) comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Single(types) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) Dim referenceAssembly = comp.GetAssemblyOrModuleSymbol(reference) Assert.Same(types(0).ContainingAssembly, referenceAssembly) End Sub Private Shared Function GetReference(useMetadataReference As Boolean, referenceComp As VisualBasicCompilation) As MetadataReference Return If(useMetadataReference, referenceComp.ToMetadataReference(), referenceComp.EmitToImageReference()) End Function <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_NotInSourceMultipleInReferences(useMetadataReference As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim source = $"Namespace N {accessibility} Class C(Of T) End Class End Namespace" Dim referenceComp1 = CreateCompilation(source) Dim referenceComp2 = CreateCompilation(source) Dim reference1 As MetadataReference = GetReference(useMetadataReference, referenceComp1) Dim reference2 As MetadataReference = GetReference(useMetadataReference, referenceComp2) Dim comp = CreateCompilation("", {reference1, reference2}) comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Equal(2, types.Length) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) AssertEx.Equal("N.C(Of T)", types(1).ToTestDisplayString()) Dim referenceAssembly1 = comp.GetAssemblyOrModuleSymbol(reference1) Assert.Same(types(0).ContainingAssembly, referenceAssembly1) Dim referenceAssembly2 = comp.GetAssemblyOrModuleSymbol(reference2) Assert.Same(types(1).ContainingAssembly, referenceAssembly2) If (useMetadataReference) Then Else Assert.False(types(0).IsInSource()) Assert.False(types(1).IsInSource()) End If End Sub <Theory, CombinatorialData> Public Sub GetTypesByMetadataName_SingleInSourceMultipleInReferences(useMetadataReference As Boolean, <CombinatorialValues("Public", "Friend")> accessibility As String) Dim source = $"Namespace N {accessibility} Class C(Of T) End Class End Namespace" Dim referenceComp1 = CreateCompilation(source) Dim referenceComp2 = CreateCompilation(source) Dim reference1 As MetadataReference = GetReference(useMetadataReference, referenceComp1) Dim reference2 As MetadataReference = GetReference(useMetadataReference, referenceComp2) Dim comp = CreateCompilation(source, {reference1, reference2}) comp.AssertNoDiagnostics() Dim types = comp.GetTypesByMetadataName("N.C`1") Assert.Equal(3, types.Length) AssertEx.Equal("N.C(Of T)", types(0).ToTestDisplayString()) Assert.Same(comp.Assembly, types(0).ContainingAssembly) AssertEx.Equal("N.C(Of T)", types(1).ToTestDisplayString()) AssertEx.Equal("N.C(Of T)", types(2).ToTestDisplayString()) Dim referenceAssembly1 = comp.GetAssemblyOrModuleSymbol(reference1) Assert.Same(types(1).ContainingAssembly, referenceAssembly1) Dim referenceAssembly2 = comp.GetAssemblyOrModuleSymbol(reference2) Assert.Same(types(2).ContainingAssembly, referenceAssembly2) End Sub <Fact> Public Sub GetTypesByMetadataName_Ordering() Dim corlibSource = " Namespace System Public Class [Object] End Class Public Class [Void] End Class End Namespace Public Class C End Class " Dim corlib = CreateEmptyCompilation(corlibSource) Dim corlibReference = corlib.EmitToImageReference() Dim otherSource = " Public Class C End Class " Dim other = CreateEmptyCompilation(otherSource, {corlibReference}) Dim otherReference = other.EmitToImageReference() Dim currentSource = " Public Class C End Class " Dim current = CreateEmptyCompilation(currentSource, {otherReference, corlibReference}) current.AssertNoDiagnostics() Dim types = current.GetTypesByMetadataName("C") AssertEx.Equal(types.Select(Function(t) t.ToTestDisplayString()), {"C", "C", "C"}) Assert.Same(current.Assembly, types(0).ContainingAssembly) Dim corlibAssembly = current.GetAssemblyOrModuleSymbol(corlibReference) Assert.Same(types(1).ContainingAssembly, corlibAssembly) Dim otherAssembly = current.GetAssemblyOrModuleSymbol(otherReference) Assert.Same(types(2).ContainingAssembly, otherAssembly) End Sub End Class End Namespace