/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Retargeting/RetargetingCustomAttributes.vb
360 строк
16 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 System.Reflection.Metadata Imports Basic.Reference.Assemblies Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Symbols.Retargeting #If Not Retargeting Then Public Class RetargetCustomAttributes Inherits BasicTestBase Public Sub New() MyBase.New() End Sub Friend Class Test01 Public c1 As VisualBasicCompilationReference Public c2 As VisualBasicCompilationReference Public c1MscorLibAssemblyRef As AssemblySymbol Public c2MscorlibAssemblyRef As AssemblySymbol Public OldMsCorLib_debuggerTypeProxyAttributeType As NamedTypeSymbol Public NewMsCorLib_debuggerTypeProxyAttributeType As NamedTypeSymbol Public OldMsCorLib_debuggerTypeProxyAttributeCtor As MethodSymbol Public NewMsCorLib_debuggerTypeProxyAttributeCtor As MethodSymbol Public OldMsCorLib_systemType As NamedTypeSymbol Public NewMsCorLib_systemType As NamedTypeSymbol Private Shared ReadOnly s_attribute As AttributeDescription = New AttributeDescription( "System.Diagnostics", "DebuggerTypeProxyAttribute", {New Byte() {CByte(SignatureAttributes.Instance), 1, CByte(SignatureTypeCode.Void), CByte(SignatureTypeCode.TypeHandle), CByte(AttributeDescription.TypeHandleTarget.SystemType)}}) Public Sub New() Dim source = <compilation name="C1"> <file name="a.vb"><![CDATA[ Imports System Imports System.Diagnostics <Assembly: DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> <Module: DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> Class TestClass <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> Public testField As Integer <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> Public ReadOnly Property TestProperty() As <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> Integer Get Return testField End Get End Property <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> Public Function TestMethod(Of T)(<DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> ByVal testParameter As T) As <DebuggerTypeProxyAttribute(GetType(System.Type), Target := GetType(Integer()), TargetTypeName := "IntArrayType")> T Return testParameter End Function End Class]]> </file> </compilation> Dim compilation1 = CreateEmptyCompilationWithReferences(source, {OldMsCorLib}) c1 = New VisualBasicCompilationReference(compilation1) Dim c1Assembly = compilation1.Assembly Dim compilation2 = VisualBasicCompilation.Create("C2", references:={NewMsCorLib, c1}) c2 = New VisualBasicCompilationReference(compilation2) Dim c1AsmRef = compilation2.GetReferencedAssemblySymbol(c1) Assert.NotSame(c1Assembly, c1AsmRef) c1MscorLibAssemblyRef = compilation1.GetReferencedAssemblySymbol(OldMsCorLib) c2MscorlibAssemblyRef = compilation2.GetReferencedAssemblySymbol(NewMsCorLib) Assert.NotSame(c1MscorLibAssemblyRef, c2MscorlibAssemblyRef) OldMsCorLib_systemType = c1MscorLibAssemblyRef.GetTypeByMetadataName("System.Type") NewMsCorLib_systemType = c2MscorlibAssemblyRef.GetTypeByMetadataName("System.Type") Assert.NotSame(OldMsCorLib_systemType, NewMsCorLib_systemType) OldMsCorLib_debuggerTypeProxyAttributeType = c1MscorLibAssemblyRef.GetTypeByMetadataName("System.Diagnostics.DebuggerTypeProxyAttribute") NewMsCorLib_debuggerTypeProxyAttributeType = c2MscorlibAssemblyRef.GetTypeByMetadataName("System.Diagnostics.DebuggerTypeProxyAttribute") Assert.NotSame(OldMsCorLib_debuggerTypeProxyAttributeType, NewMsCorLib_debuggerTypeProxyAttributeType) OldMsCorLib_debuggerTypeProxyAttributeCtor = DirectCast(OldMsCorLib_debuggerTypeProxyAttributeType.GetMembers(".ctor"). Where(Function(m) DirectCast(m, MethodSymbol).ParameterCount = 1 AndAlso TypeSymbol.Equals(DirectCast(m, MethodSymbol).Parameters(0).Type, OldMsCorLib_systemType, TypeCompareKind.ConsiderEverything)).[Single](), MethodSymbol) NewMsCorLib_debuggerTypeProxyAttributeCtor = DirectCast(NewMsCorLib_debuggerTypeProxyAttributeType.GetMembers(".ctor"). Where(Function(m) DirectCast(m, MethodSymbol).ParameterCount = 1 AndAlso TypeSymbol.Equals(DirectCast(m, MethodSymbol).Parameters(0).Type, NewMsCorLib_systemType, TypeCompareKind.ConsiderEverything)).[Single](), MethodSymbol) Assert.NotSame(OldMsCorLib_debuggerTypeProxyAttributeCtor, NewMsCorLib_debuggerTypeProxyAttributeCtor) End Sub Public Sub TestAttributeRetargeting(symbol As Symbol) ' Verify GetAttributes() TestAttributeRetargeting(symbol.GetAttributes()) ' Verify GetAttributes(AttributeType from Retargeted assembly) TestAttributeRetargeting(symbol.GetAttributes(NewMsCorLib_debuggerTypeProxyAttributeType)) ' GetAttributes(AttributeType from Underlying assembly) should find nothing. Assert.Empty(symbol.GetAttributes(OldMsCorLib_debuggerTypeProxyAttributeType)) ' Verify GetAttributes(AttributeCtor from Retargeted assembly) TestAttributeRetargeting(symbol.GetAttributes(NewMsCorLib_debuggerTypeProxyAttributeCtor)) ' Verify GetAttributes(AttributeCtor from Underlying assembly) Assert.Empty(symbol.GetAttributes(OldMsCorLib_debuggerTypeProxyAttributeCtor)) ' Verify GetAttributes(namespaceName, typeName, ctorSignature) TestAttributeRetargeting(symbol.GetAttributes(s_attribute).AsEnumerable()) End Sub Public Sub TestAttributeRetargeting_ReturnTypeAttributes(symbol As MethodSymbol) ' Verify ReturnTypeAttributes TestAttributeRetargeting(symbol.GetReturnTypeAttributes()) End Sub Private Sub TestAttributeRetargeting(attributes As IEnumerable(Of VisualBasicAttributeData)) Assert.Equal(1, attributes.Count) Dim attribute = attributes.First() Assert.IsType(Of RetargetingAttributeData)(attribute) Assert.Same(NewMsCorLib_debuggerTypeProxyAttributeType, attribute.AttributeClass) Assert.Same(NewMsCorLib_debuggerTypeProxyAttributeCtor, attribute.AttributeConstructor) Assert.Same(NewMsCorLib_systemType, attribute.AttributeConstructor.Parameters(0).Type) Assert.Equal(1, attribute.CommonConstructorArguments.Length) attribute.VerifyValue(0, TypedConstantKind.Type, NewMsCorLib_systemType) Assert.Equal(2, attribute.CommonNamedArguments.Length) attribute.VerifyValue(0, "Target", TypedConstantKind.Type, GetType(Integer())) attribute.VerifyValue(1, "TargetTypeName", TypedConstantKind.Primitive, "IntArrayType") End Sub End Class Private Shared ReadOnly Property OldMsCorLib As MetadataReference Get Return Net40.References.mscorlib End Get End Property Private Shared ReadOnly Property NewMsCorLib As MetadataReference Get Return NetFramework.mscorlib End Get End Property <Fact> Public Sub Test01_AssemblyAttribute() Dim test As New Test01() Dim c1AsmRef = test.c2.Compilation.GetReferencedAssemblySymbol(test.c1) Assert.IsType(Of RetargetingAssemblySymbol)(c1AsmRef) test.TestAttributeRetargeting(c1AsmRef) End Sub <Fact> Public Sub Test01_ModuleAttribute() Dim test As New Test01() Dim c1AsmRef = test.c2.Compilation.GetReferencedAssemblySymbol(test.c1) Dim c1ModuleSym = c1AsmRef.Modules(0) Assert.IsType(Of RetargetingModuleSymbol)(c1ModuleSym) test.TestAttributeRetargeting(c1ModuleSym) End Sub <Fact> Public Sub Test01_NamedTypeAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Assert.IsType(Of RetargetingNamedTypeSymbol)(testClass) test.TestAttributeRetargeting(testClass) End Sub <Fact> Public Sub Test01_FieldAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Dim testField As FieldSymbol = testClass.GetMembers("testField").OfType(Of FieldSymbol)().[Single]() Assert.IsType(Of RetargetingFieldSymbol)(testField) test.TestAttributeRetargeting(testField) End Sub <Fact> Public Sub Test01_PropertyAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Dim testProperty As PropertySymbol = testClass.GetMembers("TestProperty").OfType(Of PropertySymbol)().[Single]() Assert.IsType(Of RetargetingPropertySymbol)(testProperty) test.TestAttributeRetargeting(testProperty) Dim testMethod As MethodSymbol = testProperty.GetMethod Assert.IsType(Of RetargetingMethodSymbol)(testMethod) test.TestAttributeRetargeting_ReturnTypeAttributes(testMethod) End Sub <Fact> Public Sub Test01_MethodAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Dim testMethod As MethodSymbol = testClass.GetMembers("TestMethod").OfType(Of MethodSymbol)().[Single]() Assert.IsType(Of RetargetingMethodSymbol)(testMethod) test.TestAttributeRetargeting(testMethod) End Sub <Fact> Public Sub Test01_ParameterAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Dim testMethod As MethodSymbol = testClass.GetMembers("TestMethod").OfType(Of MethodSymbol)().[Single]() Assert.IsType(Of RetargetingMethodSymbol)(testMethod) Dim testParameter As ParameterSymbol = testMethod.Parameters(0) Assert.True((TryCast(testParameter, RetargetingParameterSymbol)) IsNot Nothing, "RetargetingMethodSymbol's parameter must be a RetargetingParameterSymbol") test.TestAttributeRetargeting(testParameter) End Sub <Fact> Public Sub Test01_ReturnTypeAttribute() Dim test As New Test01() Dim testClass = test.c2.Compilation.GlobalNamespace.GetTypeMembers("TestClass").[Single]() Dim testMethod As MethodSymbol = testClass.GetMembers("TestMethod").OfType(Of MethodSymbol)().[Single]() Assert.IsType(Of RetargetingMethodSymbol)(testMethod) test.TestAttributeRetargeting_ReturnTypeAttributes(testMethod) End Sub <Fact> <WorkItem(569089, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/569089")> Public Sub NullArrays() Dim source1 = <compilation> <file><![CDATA[ Imports System Public Class A Inherits Attribute Public Sub New(a As Object(), b As Integer()) End Sub Public Property P As Object() Public F As Integer() End Class <A(Nothing, Nothing, P:=Nothing, F:=Nothing)> Class C End Class ]]></file> </compilation> Dim source2 = <compilation><file></file></compilation> Dim c1 = CreateEmptyCompilationWithReferences(source1, {OldMsCorLib}) Dim c2 = CreateEmptyCompilationWithReferences(source2, {NewMsCorLib, New VisualBasicCompilationReference(c1)}) Dim c = c2.GlobalNamespace.GetMember(Of NamedTypeSymbol)("C") Assert.IsType(Of RetargetingNamedTypeSymbol)(c) Dim attr = c.GetAttributes().Single() Dim args = attr.ConstructorArguments.ToArray() Assert.True(args(0).IsNull) Assert.Equal("Object()", args(0).Type.ToDisplayString()) Assert.Throws(Of InvalidOperationException)(Function() args(0).Value) Assert.True(args(1).IsNull) Assert.Equal("Integer()", args(1).Type.ToDisplayString()) Assert.Throws(Of InvalidOperationException)(Function() args(1).Value) Dim named = attr.NamedArguments.ToDictionary(Function(e) e.Key, Function(e) e.Value) Assert.True(named("P").IsNull) Assert.Equal("Object()", named("P").Type.ToDisplayString()) Assert.Throws(Of InvalidOperationException)(Function() named("P").Value) Assert.True(named("F").IsNull) Assert.Equal("Integer()", named("F").Type.ToDisplayString()) Assert.Throws(Of InvalidOperationException)(Function() named("F").Value) End Sub <Fact> <WorkItem(65048, "https://github.com/dotnet/roslyn/issues/65048")> Public Sub MissingAttributeType() Dim source1 = " Imports System Public Class A Inherits Attribute End Class " Dim comp1 = CreateCompilation(source1, options:=TestOptions.DebugDll) Dim source2 = " <A> Public Class C1 End Class " Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugDll) Dim comp3 = CreateCompilation("", references:={comp2.ToMetadataReference()}, options:=TestOptions.DebugDll) Dim c1 = comp3.GetTypeByMetadataName("C1") Dim a = c1.GetAttributes().Single() Assert.Equal("A", a.ToString()) Assert.IsAssignableFrom(Of MissingMetadataTypeSymbol)(a.AttributeClass) Assert.Null(a.AttributeConstructor) End Sub <Fact> <WorkItem(65048, "https://github.com/dotnet/roslyn/issues/65048")> Public Sub MissingAttributeConstructor() Dim source1_1 = " Imports System Public Class A Inherits Attribute End Class " Dim comp1_1 = CreateCompilation(source1_1, options:=TestOptions.DebugDll, assemblyName:="Lib65048") Dim source2 = " <A> Public Class C1 End Class " Dim comp2 = CreateCompilation(source2, references:={comp1_1.ToMetadataReference()}, options:=TestOptions.DebugDll) Dim source1_2 = " Imports System Public Class A Inherits Attribute Public Sub New(x as Integer) End Sub End Class " Dim comp1_2 = CreateCompilation(source1_2, options:=TestOptions.DebugDll, assemblyName:="Lib65048") Dim comp3 = CreateCompilation("", references:={comp2.ToMetadataReference(), comp1_2.ToMetadataReference()}, options:=TestOptions.DebugDll) Dim c1 = comp3.GetTypeByMetadataName("C1") Dim a = c1.GetAttributes().Single() Assert.Equal("A", a.ToString()) Assert.False(a.AttributeClass.IsErrorType()) Assert.Null(a.AttributeConstructor) End Sub End Class #End If End Namespace