提交 fb22e0f2 编写于 作者: A AlekseyTs 提交者: GitHub

Merge pull request #14105 from AlekseyTs/Issue7659

Properly calculate OverridenProperty for synthesized WithEvents overrides.
......@@ -26590,7 +26590,7 @@ public static void TakeOutParam(out int x, long y)
";
var compilation = CreateCompilationWithMscorlib45(source, options: TestOptions.ReleaseExe.WithScriptClassName("Script"), parseOptions: TestOptions.Script);
compilation.VerifyDiagnostics(
compilation.GetDeclarationDiagnostics().Verify(
// (3,24): error CS7019: Type of 'x1' cannot be inferred since its initializer directly or indirectly refers to the definition.
// H.TakeOutParam(out var x1, x1);
Diagnostic(ErrorCode.ERR_RecursivelyTypedVariable, "x1").WithArguments("x1").WithLocation(3, 24)
......@@ -365,6 +365,10 @@ Friend Class MockNamedTypeSymbol
Friend Overrides Sub GenerateDeclarationErrors(cancellationToken As CancellationToken)
Throw New InvalidOperationException()
End Sub
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
Friend Class MockMethodSymbol
......
......@@ -295,7 +295,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Get
End Property
Friend Overrides Sub AddSynthesizedAttributes(compilationState as ModuleCompilationState, ByRef attributes As ArrayBuilder(Of SynthesizedAttributeData))
Friend Overrides Sub AddSynthesizedAttributes(compilationState As ModuleCompilationState, ByRef attributes As ArrayBuilder(Of SynthesizedAttributeData))
MyBase.AddSynthesizedAttributes(compilationState, attributes)
Dim compilation = Me.DeclaringCompilation
......@@ -308,5 +308,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
WellKnownMember.System_Runtime_CompilerServices_CompilerGeneratedAttribute__ctor))
End Sub
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
......@@ -300,6 +300,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Throw ExceptionUtilities.Unreachable
End Function
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Class
......
......@@ -355,6 +355,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Throw ExceptionUtilities.Unreachable
End Sub
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Class
......
......@@ -396,6 +396,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Throw ExceptionUtilities.Unreachable
End Sub
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
#Region "IErrorTypeSymbol members"
Public ReadOnly Property IErrorTypeSymbol_CandidateSymbols As ImmutableArray(Of ISymbol) Implements IErrorTypeSymbol.CandidateSymbols
......
......@@ -1475,6 +1475,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE
Next
End Function
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
......@@ -1080,6 +1080,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
''' <returns>True if this Is an interface type.</returns>
Friend MustOverride ReadOnly Property IsInterface As Boolean
''' <summary>
''' Get synthesized WithEvents overrides that aren't returned by <see cref="GetMembers"/>
''' </summary>
Friend MustOverride Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
#Region "INamedTypeSymbol"
Private ReadOnly Property INamedTypeSymbol_Arity As Integer Implements INamedTypeSymbol.Arity
......
......@@ -522,5 +522,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting
Public Overrides Function GetDocumentationCommentXml(Optional preferredCulture As CultureInfo = Nothing, Optional expandIncludes As Boolean = False, Optional cancellationToken As CancellationToken = Nothing) As String
Return _underlyingType.GetDocumentationCommentXml(preferredCulture, expandIncludes, cancellationToken)
End Function
Friend Overrides Iterator Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
For Each underlying As PropertySymbol In _underlyingType.GetSynthesizedWithEventsOverrides()
Yield RetargetingTranslator.Retarget(underlying)
Next
End Function
End Class
End Namespace
......@@ -191,5 +191,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Next
End Sub
Friend Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
' All infrastructure for proper WithEvents handling is in SourceNamedTypeSymbol,
' but this type derives directly from SourceMemberContainerTypeSymbol, which is a base class of
' SourceNamedTypeSymbol.
' Tracked by https://github.com/dotnet/roslyn/issues/14073.
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
......@@ -697,6 +697,53 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Dim overriddenInThisType As ArrayBuilder(Of TSymbol) = ArrayBuilder(Of TSymbol).GetInstance()
For Each sym In currType.GetMembers(overridingSym.Name)
ProcessMemberWithMatchingName(sym, overridingSym, overridingIsFromSomeCompilation, overridingContainingType, inexactOverriddenMembers,
inaccessibleBuilder, overriddenInThisType, stopLookup, haveExactMatch)
Next
If overridingSym.Kind = SymbolKind.Property Then
Dim prop = DirectCast(DirectCast(overridingSym, Object), PropertySymbol)
If prop.IsImplicitlyDeclared AndAlso prop.IsWithEvents Then
For Each sym In currType.GetSynthesizedWithEventsOverrides()
If sym.Name.Equals(prop.Name) Then
ProcessMemberWithMatchingName(sym, overridingSym, overridingIsFromSomeCompilation, overridingContainingType, inexactOverriddenMembers,
inaccessibleBuilder, overriddenInThisType, stopLookup, haveExactMatch)
End If
Next
End If
End If
If overriddenInThisType.Count > 1 Then
RemoveMembersWithConflictingAccessibility(overriddenInThisType)
End If
If overriddenInThisType.Count > 0 Then
If haveExactMatch Then
Debug.Assert(stopLookup)
overriddenBuilder.Clear()
End If
If overriddenBuilder.Count = 0 Then
overriddenBuilder.AddRange(overriddenInThisType)
End If
End If
overriddenInThisType.Free()
Return stopLookup
End Function
Private Shared Sub ProcessMemberWithMatchingName(
sym As Symbol,
overridingSym As TSymbol,
overridingIsFromSomeCompilation As Boolean,
overridingContainingType As NamedTypeSymbol,
inexactOverriddenMembers As ArrayBuilder(Of TSymbol),
inaccessibleBuilder As ArrayBuilder(Of TSymbol),
overriddenInThisType As ArrayBuilder(Of TSymbol),
ByRef stopLookup As Boolean,
ByRef haveExactMatch As Boolean
)
' Use original definition for accessibility check, because substitutions can cause
' reductions in accessibility that aren't appropriate (see bug #12038 for example).
Dim accessible = AccessCheck.IsSymbolAccessible(sym.OriginalDefinition, overridingContainingType.OriginalDefinition, Nothing, useSiteDiagnostics:=Nothing)
......@@ -744,26 +791,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
' Any accessible symbol of different kind stops further lookup
stopLookup = True
End If
Next
If overriddenInThisType.Count > 1 Then
RemoveMembersWithConflictingAccessibility(overriddenInThisType)
End If
If overriddenInThisType.Count > 0 Then
If haveExactMatch Then
Debug.Assert(stopLookup)
overriddenBuilder.Clear()
End If
If overriddenBuilder.Count = 0 Then
overriddenBuilder.AddRange(overriddenInThisType)
End If
End If
overriddenInThisType.Free()
Return stopLookup
End Function
End Sub
Private Shared Sub AddMemberToABuilder(member As TSymbol,
builder As ArrayBuilder(Of TSymbol))
......
......@@ -35,6 +35,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
' Overriding properties are created when a methods "Handles" is bound and can happen concurrently.
' We need this table to ensure that we create each override just once.
Private _lazyWithEventsOverrides As ConcurrentDictionary(Of PropertySymbol, SynthesizedOverridingWithEventsProperty)
Private _withEventsOverridesAreFrozen As Boolean
' method flags for the synthesized delegate methods
Friend Const DelegateConstructorMethodFlags As SourceMemberFlags = SourceMemberFlags.MethodKindConstructor
......@@ -99,7 +100,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
#Region "Completion"
Protected Overrides Sub GenerateAllDeclarationErrorsImpl(cancellationToken As CancellationToken)
#If DEBUG Then
EnsureAllHandlesAreBound()
#End If
MyBase.GenerateAllDeclarationErrorsImpl(cancellationToken)
_withEventsOverridesAreFrozen = True
cancellationToken.ThrowIfCancellationRequested()
PerformComClassAnalysis()
......@@ -144,7 +150,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
' for cases where constraint checking may result in a recursive binding attempt.
Private Function CreateLocationSpecificBinderForType(tree As SyntaxTree, location As BindingLocation) As Binder
Debug.Assert(location <> BindingLocation.None)
Dim binder As binder = BinderBuilder.CreateBinderForType(ContainingSourceModule, tree, Me)
Dim binder As Binder = BinderBuilder.CreateBinderForType(ContainingSourceModule, tree, Me)
Return New LocationSpecificBinder(location, binder)
End Function
#End Region
......@@ -164,7 +170,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Dim node = syntaxRef.GetVisualBasicSyntax()
' Set up a binder for this part of the type.
Dim binder As binder = BinderBuilder.CreateBinderForType(ContainingSourceModule, syntaxRef.SyntaxTree, Me)
Dim binder As Binder = BinderBuilder.CreateBinderForType(ContainingSourceModule, syntaxRef.SyntaxTree, Me)
' Script and implicit classes are syntactically represented by CompilationUnitSyntax or NamespaceBlockSyntax nodes.
Dim staticInitializers As ArrayBuilder(Of FieldOrPropertyInitializer) = Nothing
......@@ -2472,10 +2478,36 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Else
' we need to create a lambda here since we need to close over baseProperty
' we will however create a lambda only on a cache miss, hopefully not very often.
Return overridesDict.GetOrAdd(baseProperty, Function() New SynthesizedOverridingWithEventsProperty(baseProperty, Me))
Return overridesDict.GetOrAdd(baseProperty, Function()
Debug.Assert(Not _withEventsOverridesAreFrozen)
Return New SynthesizedOverridingWithEventsProperty(baseProperty, Me)
End Function)
End If
End Function
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
EnsureAllHandlesAreBound()
Dim overridesDict = Me._lazyWithEventsOverrides
If overridesDict IsNot Nothing Then
Return overridesDict.Values
End If
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
Private Sub EnsureAllHandlesAreBound()
If Not _withEventsOverridesAreFrozen Then
For Each member In Me.GetMembersUnordered()
If member.Kind = SymbolKind.Method Then
Dim notUsed = DirectCast(member, MethodSymbol).HandledEvents
End If
Next
_withEventsOverridesAreFrozen = True
End If
End Sub
Protected Overrides Sub AddEntryPointIfNeeded(membersBuilder As MembersAndInitializersBuilder)
If Me.TypeKind = TypeKind.Class AndAlso Not Me.IsGenericType Then
Dim mainTypeName As String = DeclaringCompilation.Options.MainTypeName
......
......@@ -1009,6 +1009,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Friend Overrides Function GetUnificationUseSiteDiagnosticRecursive(owner As Symbol, ByRef checkedTypes As HashSet(Of TypeSymbol)) As DiagnosticInfo
Return Nothing
End Function
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
Private Class SynthesizedComMethod
......
......@@ -536,6 +536,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Return OriginalDefinition.GetDocumentationCommentXml(preferredCulture, expandIncludes, cancellationToken)
End Function
Friend NotOverridable Overrides Iterator Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
For Each definition In OriginalDefinition.GetSynthesizedWithEventsOverrides()
Yield SubstituteTypeParametersForMemberProperty(definition)
Next
End Function
''' <summary>
''' Base class for symbols representing non-generic or open generic types contained within constructed generic type.
''' For example: A(Of Integer).B, A(Of Integer).B.C or A(Of Integer).B.C(Of ).
......
......@@ -431,6 +431,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Return Nothing
End Get
End Property
Friend Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
......@@ -999,5 +999,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Friend Overrides Sub GenerateDeclarationErrors(cancellationToken As CancellationToken)
Me._underlyingType.GenerateDeclarationErrors(cancellationToken)
End Sub
Friend Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
' We might need to have a real implementation here, depending on the resolution
' of https://github.com/dotnet/roslyn/issues/14104
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
......@@ -317,6 +317,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Throw ExceptionUtilities.Unreachable
End Function
Friend NotOverridable Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
Private NotInheritable Class ConstructedSymbol
Inherits UnboundGenericType
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Roslyn.Test.Utilities
......@@ -1760,6 +1761,845 @@ End Class
}
]]>)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_01()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2
Inherits MainBase1
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
Public Class MainBase3
Inherits MainBase2
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(3)
End Sub
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>, TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
"1
2
3
4")
verifier.VerifyIL("MainBase2.set_Button1", <![CDATA[
{
// Code size 55 (0x37)
.maxstack 2
.locals init (System.Action V_0,
Button V_1)
IL_0000: ldarg.0
IL_0001: ldftn "Sub MainBase2.Button1_Click()"
IL_0007: newobj "Sub System.Action..ctor(Object, System.IntPtr)"
IL_000c: stloc.0
IL_000d: ldarg.0
IL_000e: call "Function MainBase1.get_Button1() As Button"
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brfalse.s IL_001e
IL_0017: ldloc.1
IL_0018: ldloc.0
IL_0019: callvirt "Sub Button.remove_Click(System.Action)"
IL_001e: ldarg.0
IL_001f: ldarg.1
IL_0020: call "Sub MainBase1.set_Button1(Button)"
IL_0025: ldarg.0
IL_0026: call "Function MainBase1.get_Button1() As Button"
IL_002b: stloc.1
IL_002c: ldloc.1
IL_002d: brfalse.s IL_0036
IL_002f: ldloc.1
IL_0030: ldloc.0
IL_0031: callvirt "Sub Button.add_Click(System.Action)"
IL_0036: ret
}
]]>)
verifier.VerifyIL("MainBase3.set_Button1", <![CDATA[
{
// Code size 55 (0x37)
.maxstack 2
.locals init (System.Action V_0,
Button V_1)
IL_0000: ldarg.0
IL_0001: ldftn "Sub MainBase3.Button1_Click()"
IL_0007: newobj "Sub System.Action..ctor(Object, System.IntPtr)"
IL_000c: stloc.0
IL_000d: ldarg.0
IL_000e: call "Function MainBase2.get_Button1() As Button"
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brfalse.s IL_001e
IL_0017: ldloc.1
IL_0018: ldloc.0
IL_0019: callvirt "Sub Button.remove_Click(System.Action)"
IL_001e: ldarg.0
IL_001f: ldarg.1
IL_0020: call "Sub MainBase2.set_Button1(Button)"
IL_0025: ldarg.0
IL_0026: call "Function MainBase2.get_Button1() As Button"
IL_002b: stloc.1
IL_002c: ldloc.1
IL_002d: brfalse.s IL_0036
IL_002f: ldloc.1
IL_0030: ldloc.0
IL_0031: callvirt "Sub Button.add_Click(System.Action)"
IL_0036: ret
}
]]>)
verifier.VerifyIL("Main.set_Button1", <![CDATA[
{
// Code size 55 (0x37)
.maxstack 2
.locals init (System.Action V_0,
Button V_1)
IL_0000: ldarg.0
IL_0001: ldftn "Sub Main.Button1_Click()"
IL_0007: newobj "Sub System.Action..ctor(Object, System.IntPtr)"
IL_000c: stloc.0
IL_000d: ldarg.0
IL_000e: call "Function MainBase3.get_Button1() As Button"
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brfalse.s IL_001e
IL_0017: ldloc.1
IL_0018: ldloc.0
IL_0019: callvirt "Sub Button.remove_Click(System.Action)"
IL_001e: ldarg.0
IL_001f: ldarg.1
IL_0020: call "Sub MainBase3.set_Button1(Button)"
IL_0025: ldarg.0
IL_0026: call "Function MainBase3.get_Button1() As Button"
IL_002b: stloc.1
IL_002c: ldloc.1
IL_002d: brfalse.s IL_0036
IL_002f: ldloc.1
IL_0030: ldloc.0
IL_0031: callvirt "Sub Button.add_Click(System.Action)"
IL_0036: ret
}
]]>)
verifier.VerifyIL("MainBase2.get_Button1", <![CDATA[
{
// Code size 7 (0x7)
.maxstack 1
.locals init (Button V_0)
IL_0000: ldarg.0
IL_0001: call "Function MainBase1.get_Button1() As Button"
IL_0006: ret
}
]]>)
verifier.VerifyIL("MainBase3.get_Button1", <![CDATA[
{
// Code size 7 (0x7)
.maxstack 1
.locals init (Button V_0)
IL_0000: ldarg.0
IL_0001: call "Function MainBase2.get_Button1() As Button"
IL_0006: ret
}
]]>)
verifier.VerifyIL("Main.get_Button1", <![CDATA[
{
// Code size 7 (0x7)
.maxstack 1
.locals init (Button V_0)
IL_0000: ldarg.0
IL_0001: call "Function MainBase3.get_Button1() As Button"
IL_0006: ret
}
]]>)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_02()
Dim source1 =
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2
Inherits MainBase1
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
</file>
</compilation>
Dim compilation1 = CreateCompilationWithMscorlibAndVBRuntime(source1, TestOptions.ReleaseDll)
Dim source2 =
<compilation>
<file name="a.vb">
Public Class MainBase3
Inherits MainBase2
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(3)
End Sub
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>
Dim compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.EmitToImageReference()}, TestOptions.ReleaseExe)
CompileAndVerify(compilation2, expectedOutput:=
"1
2
3
4")
compilation2 = CreateCompilationWithMscorlib45AndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
CompileAndVerify(compilation2, expectedOutput:=
"1
2
3
4")
compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
CompileAndVerify(compilation2, expectedOutput:=
"1
2
3
4")
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_03()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Imports System
Imports System.ComponentModel
Public Class EventSource
Public Event MyEvent()
Sub test()
RaiseEvent MyEvent()
End Sub
End Class
Public Class OuterClass
Private SubObject As New EventSource
&lt;DesignOnly(True)>
&lt;DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
Public Property SomeProperty() As EventSource
Get
Return SubObject
End Get
Set(value As EventSource)
End Set
End Property
Sub Test()
SubObject.test()
End Sub
End Class
Public Class MainBase1
Public WithEvents Button1 As New OuterClass()
Private Sub Button1_Click() Handles Button1.SomeProperty.MyEvent
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2
Inherits MainBase1
Private Sub Button1_Click() Handles Button1.SomeProperty.MyEvent
System.Console.WriteLine(2)
End Sub
End Class
Public Class MainBase3
Inherits MainBase2
Private Sub Button1_Click() Handles Button1.SomeProperty.MyEvent
System.Console.WriteLine(3)
End Sub
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.SomeProperty.MyEvent
System.Console.WriteLine("4")
End Sub
End Class
Module Module1
Sub Main()
Dim m = New Main()
m.Button1.Test()
End Sub
End Module
</file>
</compilation>, TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
"1
2
3
4")
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_04()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2
Inherits MainBase1
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
Public Class MainBase3
Inherits MainBase2
Protected Overrides Property Button1 As Button
Get
Return MyBase.Button1
End Get
Set
System.Console.WriteLine("3")
MyBase.Button1 = Value
End Set
End Property
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>, TestOptions.ReleaseExe)
compilation.AssertTheseDiagnostics(
<expected>
BC30284: property 'Button1' cannot be declared 'Overrides' because it does not override a property in a base class.
Protected Overrides Property Button1 As Button
~~~~~~~
BC40004: property 'Button1' conflicts with WithEvents variable 'Button1' in the base class 'MainBase1' and should be declared 'Shadows'.
Protected Overrides Property Button1 As Button
~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click
~~~~~~~
</expected>)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_05()
Dim source1 =
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2
Inherits MainBase1
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
</file>
</compilation>
Dim compilation1 = CreateCompilationWithMscorlibAndVBRuntime(source1, TestOptions.ReleaseDll)
Dim source2 =
<compilation>
<file name="a.vb">
Public Class MainBase3
Inherits MainBase2
Protected Overrides Property Button1 As Button
Get
Return MyBase.Button1
End Get
Set
System.Console.WriteLine("3")
MyBase.Button1 = Value
End Set
End Property
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>
Dim compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.EmitToImageReference()}, TestOptions.ReleaseExe)
compilation2.AssertTheseDiagnostics(
<expected>
BC30284: property 'Button1' cannot be declared 'Overrides' because it does not override a property in a base class.
Protected Overrides Property Button1 As Button
~~~~~~~
BC40004: property 'Button1' conflicts with WithEvents variable 'Button1' in the base class 'MainBase2' and should be declared 'Shadows'.
Protected Overrides Property Button1 As Button
~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click
~~~~~~~
</expected>)
compilation2 = CreateCompilationWithMscorlib45AndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
Dim expected =
<expected>
BC30284: property 'Button1' cannot be declared 'Overrides' because it does not override a property in a base class.
Protected Overrides Property Button1 As Button
~~~~~~~
BC40004: property 'Button1' conflicts with WithEvents variable 'Button1' in the base class 'MainBase1' and should be declared 'Shadows'.
Protected Overrides Property Button1 As Button
~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click
~~~~~~~
</expected>
compilation2.AssertTheseDiagnostics(expected)
compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
compilation2.AssertTheseDiagnostics(expected)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_06()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase3
Inherits MainBase1
Protected Overrides Property Button1 As Button
Get
Return MyBase.Button1
End Get
Set
System.Console.WriteLine("3")
MyBase.Button1 = Value
End Set
End Property
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>, TestOptions.ReleaseExe)
compilation.AssertTheseDiagnostics(
<expected>
BC30284: property 'Button1' cannot be declared 'Overrides' because it does not override a property in a base class.
Protected Overrides Property Button1 As Button
~~~~~~~
BC40004: property 'Button1' conflicts with WithEvents variable 'Button1' in the base class 'MainBase1' and should be declared 'Shadows'.
Protected Overrides Property Button1 As Button
~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click
~~~~~~~
</expected>)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_07()
Dim source1 =
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
</file>
</compilation>
Dim compilation1 = CreateCompilationWithMscorlibAndVBRuntime(source1, TestOptions.ReleaseDll)
Dim source2 =
<compilation>
<file name="a.vb">
Public Class MainBase3
Inherits MainBase1
Protected Overrides Property Button1 As Button
Get
Return MyBase.Button1
End Get
Set
System.Console.WriteLine("3")
MyBase.Button1 = Value
End Set
End Property
End Class
Public Class Main
Inherits MainBase3
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>
Dim compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.EmitToImageReference()}, TestOptions.ReleaseExe)
Dim expected =
<expected>
BC30284: property 'Button1' cannot be declared 'Overrides' because it does not override a property in a base class.
Protected Overrides Property Button1 As Button
~~~~~~~
BC40004: property 'Button1' conflicts with WithEvents variable 'Button1' in the base class 'MainBase1' and should be declared 'Shadows'.
Protected Overrides Property Button1 As Button
~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click
~~~~~~~
</expected>
compilation2.AssertTheseDiagnostics(expected)
compilation2 = CreateCompilationWithMscorlib45AndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
compilation2.AssertTheseDiagnostics(expected)
compilation2 = CreateCompilationWithMscorlibAndVBRuntime(source2, {compilation1.ToMetadataReference()}, TestOptions.ReleaseExe)
compilation2.AssertTheseDiagnostics(expected)
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
Public Sub HandlesOnMultipleLevels_08()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1(Of T1)
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Public Class MainBase2(Of T2)
Inherits MainBase1(Of MainBase2(Of T2))
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
Public Class MainBase3(Of T3)
Inherits MainBase2(Of MainBase3(Of T3))
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(3)
End Sub
End Class
Public Class Main(Of T4)
Inherits MainBase3(Of Main(Of T4))
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine("4")
End Sub
Shared Sub Test()
Dim m = New Main(Of T4)()
m.Button1.Raise()
End Sub
End Class
Public Class Main
Shared Sub Main()
Global.Main(Of Integer).Test()
End Sub
End Class
</file>
</compilation>, TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
"1
2
3
4")
End Sub
<Fact>
<WorkItem(7659, "https://github.com/dotnet/roslyn/issues/7659")>
<WorkItem(14104, "https://github.com/dotnet/roslyn/issues/14104")>
<CompilerTrait(CompilerFeature.Tuples)>
Public Sub HandlesOnMultipleLevels_09()
Dim compilation = CreateCompilationWithMscorlibAndVBRuntime(
<compilation>
<file name="a.vb">
Public Class Button
Event Click As System.Action
Sub Raise()
RaiseEvent Click()
End Sub
End Class
Public Class MainBase1
Protected WithEvents Button1 As New Button()
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(1)
End Sub
End Class
Namespace System
Public Class ValueTuple(Of T1, T2)
Inherits MainBase1
Public Dim Item1 As T1
Public Dim Item2 As T2
Public Sub New(item1 As T1, item2 As T2)
me.Item1 = item1
me.Item2 = item2
End Sub
Public Sub New()
End Sub
Private Sub Button1_Click() Handles Button1.Click
System.Console.WriteLine(2)
End Sub
End Class
End Namespace
Public Class Main
Inherits System.ValueTuple(Of Integer, Integer)
Private Sub Button1_Click() Handles Button1.Click ' 3
System.Console.WriteLine("3")
End Sub
Shared Sub Main()
Dim m = New Main()
m.Button1.Raise()
End Sub
End Class
</file>
</compilation>, TestOptions.ReleaseExe)
#If Not ISSUE_14104_IS_FIXED Then
compilation.AssertTheseDiagnostics(
<expected>
BC30299: 'Main' cannot inherit from class '' because '' is declared 'NotInheritable'.
Inherits System.ValueTuple(Of Integer, Integer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Private Sub Button1_Click() Handles Button1.Click ' 3
~~~~~~~
BC30456: 'Button1' is not a member of 'Main'.
m.Button1.Raise()
~~~~~~~~~
</expected>)
#Else
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
"1
2
3")
#End If
End Sub
End Class
End Namespace
......@@ -356,6 +356,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator
Next
End Sub
Friend Overrides Function GetSynthesizedWithEventsOverrides() As IEnumerable(Of PropertySymbol)
Return SpecializedCollections.EmptyEnumerable(Of PropertySymbol)()
End Function
End Class
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册