/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/Metadata/PE/LoadingEvents.vb
261 строка
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 Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Symbols.Metadata.PE Public Class LoadingEvents : Inherits BasicTestBase <Fact> Public Sub LoadNonGenericEvents() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("NonGeneric") CheckInstanceAndStaticEvents([class], "System.Action") End Sub <Fact> Public Sub LoadGenericEvents() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("Generic") CheckInstanceAndStaticEvents([class], "System.Action(Of T)") End Sub <Fact> Public Sub LoadClosedGenericEvents() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("ClosedGeneric") CheckInstanceAndStaticEvents([class], "System.Action(Of System.Int32)") End Sub <Fact> Public Sub Error_Regress40025DLL() Dim source = <compilation name="Error_Regress40025DLL1"> <file name="a.vb"> Module Program Sub Main() Dim d As Regress40025DLL.Regress40025DLL.AClass = nothing 'COMPILEERROR: BC30005, "ee" AddHandler d.ee, Nothing End Sub End Module </file> </compilation> Dim ref = MetadataReference.CreateFromImage(TestResources.General.Regress40025DLL.AsImmutableOrNull()) Dim c1 = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source, {ref}, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(c1, <errors> BC30005: Reference required to assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' containing the definition for event 'Public Event ee As PlayRecordCallback'. Add one to your project. AddHandler d.ee, Nothing ~~~~ </errors>) Dim diagnostics = c1.GetDiagnostics() Assert.True(diagnostics.Any(Function(d) d.Code = ERRID.ERR_UnreferencedAssemblyEvent3)) For Each d In diagnostics If d.Code = ERRID.ERR_UnreferencedAssemblyEvent3 Then Dim actualAssemblyId = c1.GetUnreferencedAssemblyIdentities(d).Single() Dim expectedAssemblyId As AssemblyIdentity = Nothing AssemblyIdentity.TryParseDisplayName("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", expectedAssemblyId) Assert.Equal(actualAssemblyId, expectedAssemblyId) End If Next End Sub Private Shared Sub CheckInstanceAndStaticEvents([class] As NamedTypeSymbol, eventTypeDisplayString As String) Dim instanceEvent = [class].GetMember(Of EventSymbol)("InstanceEvent") Assert.Equal(SymbolKind.[Event], instanceEvent.Kind) Assert.[False](instanceEvent.IsShared) Assert.Equal(eventTypeDisplayString, instanceEvent.Type.ToTestDisplayString()) CheckAccessorShape(instanceEvent.AddMethod, instanceEvent) CheckAccessorShape(instanceEvent.RemoveMethod, instanceEvent) Dim staticEvent = [class].GetMember(Of EventSymbol)("StaticEvent") Assert.Equal(SymbolKind.[Event], staticEvent.Kind) Assert.[True](staticEvent.IsShared) Assert.Equal(eventTypeDisplayString, staticEvent.Type.ToTestDisplayString()) CheckAccessorShape(staticEvent.AddMethod, staticEvent) CheckAccessorShape(staticEvent.RemoveMethod, staticEvent) End Sub Private Shared Sub CheckAccessorShape(accessor As MethodSymbol, [event] As EventSymbol) Assert.Same([event], accessor.AssociatedSymbol) Select Case accessor.MethodKind Case MethodKind.EventAdd Assert.Same([event].AddMethod, accessor) Case MethodKind.EventRemove Assert.Same([event].RemoveMethod, accessor) Case Else Assert.[False](True, String.Format("Accessor {0} has unexpected MethodKind {1}", accessor, accessor.MethodKind)) End Select Assert.Equal([event].IsMustOverride, accessor.IsMustOverride) Assert.Equal([event].IsOverrides, accessor.IsOverrides) Assert.Equal([event].IsOverridable, accessor.IsOverridable) Assert.Equal([event].IsNotOverridable, accessor.IsNotOverridable) ' TODO: do we need to support Extern events? ' Assert.Equal([event].IsExtern, accessor.IsExtern) Assert.Equal(SpecialType.System_Void, accessor.ReturnType.SpecialType) Assert.Equal([event].Type, accessor.Parameters.Single().Type) End Sub <Fact> Public Sub LoadSignatureMismatchEvents() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("SignatureMismatch") Dim mismatchedAddEvent = [class].GetMember(Of EventSymbol)("AddMismatch") Dim mismatchedRemoveEvent = [class].GetMember(Of EventSymbol)("RemoveMismatch") Assert.NotEqual(mismatchedAddEvent.Type, mismatchedAddEvent.AddMethod.Parameters.Single().Type) Assert.NotEqual(mismatchedRemoveEvent.Type, mismatchedRemoveEvent.RemoveMethod.Parameters.Single().Type) End Sub <Fact> Public Sub LoadMissingParameterEvents() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("AccessorMissingParameter") Dim noParamAddEvent = [class].GetMember(Of EventSymbol)("AddNoParam") Dim noParamRemoveEvent = [class].GetMember(Of EventSymbol)("RemoveNoParam") Assert.Equal(0, noParamAddEvent.AddMethod.Parameters.Length) Assert.Equal(0, noParamRemoveEvent.RemoveMethod.Parameters.Length) End Sub <Fact> Public Sub LoadNonDelegateEvent() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.Events}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [class] = globalNamespace.GetMember(Of NamedTypeSymbol)("NonDelegateEvent") Dim nonDelegateEvent = [class].GetMember(Of EventSymbol)("NonDelegate") Assert.Equal(SpecialType.System_Int32, nonDelegateEvent.Type.SpecialType) End Sub <Fact> Public Sub TestExplicitImplementationSimple() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.ExplicitInterfaceImplementation.Events.CSharp}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [interface] = DirectCast(globalNamespace.GetTypeMembers("Interface").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Interface], [interface].TypeKind) Dim interfaceEvent = DirectCast([interface].GetMembers("Event").Single(), EventSymbol) Dim [class] = DirectCast(globalNamespace.GetTypeMembers("Class").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Class], [class].TypeKind) Assert.[True]([class].Interfaces.Contains([interface])) Dim classEvent = DirectCast([class].GetMembers("Interface.Event").Single(), EventSymbol) Dim explicitImpl = classEvent.ExplicitInterfaceImplementations.Single() Assert.Equal(interfaceEvent, explicitImpl) End Sub <Fact> Public Sub TestExplicitImplementationGeneric() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.ExplicitInterfaceImplementation.Events.CSharp}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [interface] = DirectCast(globalNamespace.GetTypeMembers("IGeneric").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Interface], [interface].TypeKind) Dim interfaceEvent = DirectCast([interface].GetMembers("Event").Single(), EventSymbol) Dim [class] = DirectCast(globalNamespace.GetTypeMembers("Generic").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Class], [class].TypeKind) Dim substitutedInterface = [class].Interfaces.Single() Assert.Equal([interface], substitutedInterface.ConstructedFrom) Dim substitutedInterfaceEvent = DirectCast(substitutedInterface.GetMembers("Event").Single(), EventSymbol) Assert.Equal(interfaceEvent, substitutedInterfaceEvent.OriginalDefinition) Dim classEvent = DirectCast([class].GetMembers("IGeneric<S>.Event").Single(), EventSymbol) Dim explicitImpl = classEvent.ExplicitInterfaceImplementations.Single() Assert.Equal(substitutedInterfaceEvent, explicitImpl) End Sub <Fact> Public Sub TestExplicitImplementationConstructed() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.ExplicitInterfaceImplementation.Events.CSharp}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim [interface] = DirectCast(globalNamespace.GetTypeMembers("IGeneric").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Interface], [interface].TypeKind) Dim interfaceEvent = DirectCast([interface].GetMembers("Event").Single(), EventSymbol) Dim [class] = DirectCast(globalNamespace.GetTypeMembers("Constructed").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Class], [class].TypeKind) Dim substitutedInterface = [class].Interfaces.Single() Assert.Equal([interface], substitutedInterface.ConstructedFrom) Dim substitutedInterfaceEvent = DirectCast(substitutedInterface.GetMembers("Event").Single(), EventSymbol) Assert.Equal(interfaceEvent, substitutedInterfaceEvent.OriginalDefinition) Dim classEvent = DirectCast([class].GetMembers("IGeneric<System.Int32>.Event").Single(), EventSymbol) Dim explicitImpl = classEvent.ExplicitInterfaceImplementations.Single() Assert.Equal(substitutedInterfaceEvent, explicitImpl) End Sub <Fact> Public Sub TestExplicitImplementationDefRefDef() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.ExplicitInterfaceImplementation.Events.CSharp}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim defInterface = DirectCast(globalNamespace.GetTypeMembers("Interface").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Interface], defInterface.TypeKind) Dim defInterfaceEvent = DirectCast(defInterface.GetMembers("Event").Single(), EventSymbol) Dim refInterface = DirectCast(globalNamespace.GetTypeMembers("IGenericInterface").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Interface], defInterface.TypeKind) Assert.[True](refInterface.Interfaces.Contains(defInterface)) Dim [class] = DirectCast(globalNamespace.GetTypeMembers("IndirectImplementation").Single(), NamedTypeSymbol) Assert.Equal(TypeKind.[Class], [class].TypeKind) Dim classInterfacesConstructedFrom = [class].Interfaces.[Select](Function(i) i.ConstructedFrom) Assert.Equal(2, classInterfacesConstructedFrom.Count()) Assert.Contains(defInterface, classInterfacesConstructedFrom) Assert.Contains(refInterface, classInterfacesConstructedFrom) Dim classEvent = DirectCast([class].GetMembers("Interface.Event").Single(), EventSymbol) Dim explicitImpl = classEvent.ExplicitInterfaceImplementations.Single() Assert.Equal(defInterfaceEvent, explicitImpl) End Sub <Fact> Public Sub TestTypeParameterPositions() Dim assemblies = MetadataTestHelpers.GetSymbolsForReferences({NetFramework.mscorlib, TestReferences.SymbolsTests.ExplicitInterfaceImplementation.Events.CSharp}) Dim globalNamespace = assemblies.ElementAt(1).GlobalNamespace Dim outerInterface = DirectCast(globalNamespace.GetTypeMembers("IGeneric2").Single(), NamedTypeSymbol) Assert.Equal(1, outerInterface.Arity) Assert.Equal(TypeKind.[Interface], outerInterface.TypeKind) Dim outerInterfaceEvent = outerInterface.GetMembers().Where(Function(m) m.Kind = SymbolKind.[Event]).Single() Dim outerClass = DirectCast(globalNamespace.GetTypeMembers("Outer").Single(), NamedTypeSymbol) Assert.Equal(1, outerClass.Arity) Assert.Equal(TypeKind.[Class], outerClass.TypeKind) Dim innerInterface = DirectCast(outerClass.GetTypeMembers("IInner").Single(), NamedTypeSymbol) Assert.Equal(1, innerInterface.Arity) Assert.Equal(TypeKind.[Interface], innerInterface.TypeKind) Dim innerInterfaceEvent = innerInterface.GetMembers().Where(Function(m) m.Kind = SymbolKind.[Event]).Single() Dim innerClass1 = DirectCast(outerClass.GetTypeMembers("Inner1").Single(), NamedTypeSymbol) CheckInnerClassHelper(innerClass1, "IGeneric2<A>.Event", outerInterfaceEvent) Dim innerClass2 = DirectCast(outerClass.GetTypeMembers("Inner2").Single(), NamedTypeSymbol) CheckInnerClassHelper(innerClass2, "IGeneric2<T>.Event", outerInterfaceEvent) Dim innerClass3 = DirectCast(outerClass.GetTypeMembers("Inner3").Single(), NamedTypeSymbol) CheckInnerClassHelper(innerClass3, "Outer<T>.IInner<C>.Event", innerInterfaceEvent) Dim innerClass4 = DirectCast(outerClass.GetTypeMembers("Inner4").Single(), NamedTypeSymbol) CheckInnerClassHelper(innerClass4, "Outer<T>.IInner<T>.Event", innerInterfaceEvent) End Sub Private Shared Sub CheckInnerClassHelper(innerClass As NamedTypeSymbol, methodName As String, interfaceEvent As Symbol) Dim [interface] = interfaceEvent.ContainingType Assert.Equal(1, innerClass.Arity) Assert.Equal(TypeKind.[Class], innerClass.TypeKind) Assert.Equal([interface], innerClass.Interfaces.Single().ConstructedFrom) Dim innerClassEvent = DirectCast(innerClass.GetMembers(methodName).Single(), EventSymbol) Dim innerClassImplementingEvent = innerClassEvent.ExplicitInterfaceImplementations.Single() Assert.Equal(interfaceEvent, innerClassImplementingEvent.OriginalDefinition) Assert.Equal([interface], innerClassImplementingEvent.ContainingType.ConstructedFrom) End Sub End Class End Namespace