/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/RefStructInterfacesTests.vb
244 строки
9 KB
Jared Parsons
Move net451 test assets to net461 (#74766)
17 авг 2024, 19:21
Не верифицирован
17 авг 2024, 19:21
75b26a2
Код
Авторство
О чём код?
' 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 Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class RefStructInterfacesTests Inherits BasicTestBase Private Shared ReadOnly s_targetFrameworkSupportingByRefLikeGenerics As TargetFramework = TargetFramework.Net90 <Fact> Public Sub RuntimeCapability_01() Dim comp = CreateCompilation("", targetFramework:=s_targetFrameworkSupportingByRefLikeGenerics) Assert.True(comp.SupportsRuntimeCapability(RuntimeCapability.ByRefLikeGenerics)) comp = CreateCompilation("", targetFramework:=TargetFramework.Mscorlib461Extended) Assert.False(comp.SupportsRuntimeCapability(RuntimeCapability.ByRefLikeGenerics)) comp = CreateCompilation("", targetFramework:=TargetFramework.Net80) Assert.False(comp.SupportsRuntimeCapability(RuntimeCapability.ByRefLikeGenerics)) End Sub <Fact> Public Sub AllowsConstraint_01() Dim csSource = " public class A<T>; public class C<T> where T : allows ref struct { } public class D { static public void M<T>() where T : allows ref struct { System.Console.WriteLine(typeof(T)); } } " Dim csCompilation = CreateCSharpCompilation(csSource, parseOptions:=CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview), referencedAssemblies:=TargetFrameworkUtil.GetReferences(s_targetFrameworkSupportingByRefLikeGenerics)).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class B(Of S) Inherits C(Of S) End Class Public Class Test Shared Sub Main() Dim c1 = New C(Of Integer)() Dim c2 = New C(Of Test)() Dim b1 = New B(Of Integer)() Dim b2 = New B(Of Test)() D.M(Of Integer)() D.M(Of Test)() System.Console.Write("Done") End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, targetFramework:=s_targetFrameworkSupportingByRefLikeGenerics, references:={csCompilation}, options:=TestOptions.DebugExe) Dim a = comp1.GetTypeByMetadataName("A`1") AssertEx.Equal("A(Of T)", a.ToDisplayString(SymbolDisplayFormat.TestFormatWithConstraints)) Assert.False(a.TypeParameters.Single().AllowsRefLikeType) Dim b = comp1.GetTypeByMetadataName("B`1") AssertEx.Equal("B(Of S)", b.ToDisplayString(SymbolDisplayFormat.TestFormatWithConstraints)) Assert.False(b.TypeParameters.Single().AllowsRefLikeType) Dim c = comp1.GetTypeByMetadataName("C`1") AssertEx.Equal("C(Of T)", c.ToDisplayString(SymbolDisplayFormat.TestFormatWithConstraints)) Assert.True(c.TypeParameters.Single().AllowsRefLikeType) c = b.BaseTypeNoUseSiteDiagnostics AssertEx.Equal("C(Of S)", c.ToDisplayString(SymbolDisplayFormat.TestFormatWithConstraints)) Assert.True(c.TypeParameters.Single().AllowsRefLikeType) CompileAndVerify( comp1, verify:=If(ExecutionConditionUtil.IsMonoOrCoreClr, Verification.Passes, Verification.Skipped), expectedOutput:=If(ExecutionConditionUtil.IsMonoOrCoreClr, "System.Int32 Test Done", Nothing)).VerifyDiagnostics() End Sub <Fact> Public Sub AllowsConstraint_02() Dim csSource = " public class C { public virtual void M<T>() where T : allows ref struct { } } " Dim csCompilation = CreateCSharpCompilation(csSource, parseOptions:=CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview), referencedAssemblies:=TargetFrameworkUtil.GetReferences(s_targetFrameworkSupportingByRefLikeGenerics)).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class B Inherits C Public Overrides Sub M(Of T) End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, targetFramework:=s_targetFrameworkSupportingByRefLikeGenerics, references:={csCompilation}) Dim m = comp1.GetMember(Of MethodSymbol)("B.M") Assert.False(m.TypeParameters.Single().AllowsRefLikeType) Assert.True(m.OverriddenMethod.TypeParameters.Single().AllowsRefLikeType) comp1.AssertTheseDiagnostics( <expected> BC32077: 'Public Overrides Sub M(Of T)()' cannot override 'Public Overridable Overloads Sub M(Of T)()' because they differ by type parameter constraints. Public Overrides Sub M(Of T) ~ </expected>) End Sub <Fact> Public Sub AllowsConstraint_03() Dim csSource = " public interface IC { public abstract void M<T>() where T : allows ref struct; } " Dim csCompilation = CreateCSharpCompilation(csSource, parseOptions:=CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview), referencedAssemblies:=TargetFrameworkUtil.GetReferences(s_targetFrameworkSupportingByRefLikeGenerics)).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class B Implements IC Sub M(Of T) Implements IC.M End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, targetFramework:=s_targetFrameworkSupportingByRefLikeGenerics, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC32078: 'Public Sub M(Of T)()' cannot implement 'IC.Sub M(Of T)()' because they differ by type parameter constraints. Sub M(Of T) Implements IC.M ~~~~ </expected>) Dim m = comp1.GetMember(Of MethodSymbol)("B.M") Assert.False(m.TypeParameters.Single().AllowsRefLikeType) Assert.True(m.ExplicitInterfaceImplementations.Single().TypeParameters.Single().AllowsRefLikeType) End Sub <Fact()> Public Sub NoPiaEmbedding() Dim csSource = " using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [assembly: ImportedFromTypeLib(""GeneralPIA.dll"")] [assembly: Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58257"")] [ComImport()] [Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58278"")] public interface ITest29 { void M21<T1>() where T1 : allows ref struct; } " Dim csCompilation = CreateCSharpCompilation(csSource, parseOptions:=CSharp.CSharpParseOptions.Default.WithLanguageVersion(CSharp.LanguageVersion.Preview), assemblyName:="Pia", referencedAssemblies:=TargetFrameworkUtil.GetReferences(s_targetFrameworkSupportingByRefLikeGenerics)).EmitToImageReference(embedInteropTypes:=True) Dim sources1 = <compilation name="1"> <file name="a.vb"><![CDATA[ Interface I3 Inherits ITest29 End Interface ]]></file> </compilation> Dim validator As Action(Of ModuleSymbol) = Sub([module]) DirectCast([module], PEModuleSymbol).Module.PretendThereArentNoPiaLocalTypes() Dim type2 = [module].GlobalNamespace.GetMember(Of PENamedTypeSymbol)("ITest29") Assert.Equal(TypeKind.Interface, type2.TypeKind) Dim method = type2.GetMember(Of PEMethodSymbol)("M21") Dim tp = method.TypeParameters Dim t1 = tp(0) Assert.Equal("T1", t1.Name) Assert.True(t1.AllowsRefLikeType) End Sub Dim compilation1 = CreateCompilation( sources1, targetFramework:=s_targetFrameworkSupportingByRefLikeGenerics, options:=TestOptions.DebugDll, references:={csCompilation}) CompileAndVerify(compilation1, symbolValidator:=validator, verify:=Verification.Skipped).VerifyDiagnostics() End Sub End Class End Namespace