From 1fee560e2f95d132146dc8a7aa87966dae503c11 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 3 Sep 2015 14:05:32 -0700 Subject: [PATCH] Add support for RemoveHandler statements in IMethodXML generation --- .../MethodXML/MethodXMLTests_VBStatements.vb | 335 ++++++++++++++++++ .../CodeModel/MethodXML/MethodXmlBuilder.vb | 33 +- 2 files changed, 357 insertions(+), 11 deletions(-) diff --git a/src/VisualStudio/Core/Test/CodeModel/MethodXML/MethodXMLTests_VBStatements.vb b/src/VisualStudio/Core/Test/CodeModel/MethodXML/MethodXMLTests_VBStatements.vb index 67fc8c3383c..13d41c2d9d5 100644 --- a/src/VisualStudio/Core/Test/CodeModel/MethodXML/MethodXMLTests_VBStatements.vb +++ b/src/VisualStudio/Core/Test/CodeModel/MethodXML/MethodXMLTests_VBStatements.vb @@ -340,5 +340,340 @@ End Class Test(definition, expected) End Sub + + Public Sub VBStatements_RemoveHandler1() + Dim definition = + + + + +Imports System + +Class C + Event E As EventHandler + + Sub Handler(sender As Object, e As EventArgs) + End Sub + + $$Sub M() + RemoveHandler E, AddressOf Handler + End Sub +End Class + + + + + Dim expected = + + + + + + + + + + + + N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + Test(definition, expected) + End Sub + + + Public Sub VBStatements_RemoveHandler2() + Dim definition = + + + + +Imports System + +Class B + Event E As EventHandler +End Class + +Class C + Dim b As New B + + Sub Handler(sender As Object, e As EventArgs) + End Sub + + $$Sub M() + RemoveHandler b.E, AddressOf Handler + End Sub +End Class + + + + + Dim expected = + + + + + + + + + + + + + + + + N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + Test(definition, expected) + End Sub + + + Public Sub VBStatements_RemoveHandler3() + Dim definition = + + + + +Imports System + +Class B + Event E As EventHandler + + Sub Handler(sender As Object, e As EventArgs) + End Sub +End Class + +Class C + Dim b As New B + + $$Sub M() + RemoveHandler b.E, AddressOf b.Handler + End Sub +End Class + + + + + Dim expected = + + + + + + + + + + + + + + + + N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + Test(definition, expected) + End Sub + + + Public Sub VBStatements_RemoveHandler4() + Dim definition = + + + + +Imports System + +Class A + Event E As EventHandler +End Class + +Class B + Property A As New A + + Sub Handler(sender As Object, e As EventArgs) + End Sub +End Class + +Class C + Dim b As New B + + $$Sub M() + RemoveHandler b.A.E, AddressOf b.Handler + End Sub +End Class + + + + + Dim expected = + + + + + + + + + + + + + + + + + + + + N.A, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + Test(definition, expected) + End Sub + + + Public Sub VBStatements_RemoveHandler5() + Dim definition = + + + + +Imports System + +Class A + Sub Handler(sender As Object, e As EventArgs) + End Sub +End Class + +Class B + Property A As New A + + Event E As EventHandler +End Class + +Class C + Dim b As New B + + $$Sub M() + RemoveHandler b.E, AddressOf b.A.Handler + End Sub +End Class + + + + + Dim expected = + + + + + + + + + + + + + + + + N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + + + + N.A, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + Test(definition, expected) + End Sub + End Class End Namespace \ No newline at end of file diff --git a/src/VisualStudio/VisualBasic/Impl/CodeModel/MethodXML/MethodXmlBuilder.vb b/src/VisualStudio/VisualBasic/Impl/CodeModel/MethodXML/MethodXmlBuilder.vb index 790d4b8c62c..10059e89694 100644 --- a/src/VisualStudio/VisualBasic/Impl/CodeModel/MethodXML/MethodXmlBuilder.vb +++ b/src/VisualStudio/VisualBasic/Impl/CodeModel/MethodXML/MethodXmlBuilder.vb @@ -40,8 +40,9 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel.MethodXm success = TryGenerateCall(DirectCast(statement, CallStatementSyntax)) Case SyntaxKind.ExpressionStatement success = TryGenerateExpressionStatement(DirectCast(statement, ExpressionStatementSyntax)) - Case SyntaxKind.AddHandlerStatement - success = TryGenerateAddHandlerStatement(DirectCast(statement, AddRemoveHandlerStatementSyntax)) + Case SyntaxKind.AddHandlerStatement, + SyntaxKind.RemoveHandlerStatement + success = TryGenerateAddOrRemoveHandlerStatement(DirectCast(statement, AddRemoveHandlerStatementSyntax)) End Select If Not success Then @@ -114,20 +115,30 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel.MethodXm End Using End Function - Private Function TryGenerateAddHandlerStatement(addHandlerStatement As AddRemoveHandlerStatementSyntax) As Boolean + Private Function TryGenerateAddOrRemoveHandlerStatement(addHandlerStatement As AddRemoveHandlerStatementSyntax) As Boolean ' AddHandler statements are represented as invocations of an event's add_* method. + ' RemoveHandler statements are represented as invocations of an event's remove_* method. + + Dim eventExpression = addHandlerStatement.EventExpression + Dim eventSymbol = TryCast(SemanticModel.GetSymbolInfo(eventExpression).Symbol, IEventSymbol) + + Dim eventAccessor As IMethodSymbol + If addHandlerStatement.Kind() = SyntaxKind.AddHandlerStatement Then + eventAccessor = eventSymbol?.AddMethod + ElseIf addHandlerStatement.Kind() = SyntaxKind.RemoveHandlerStatement + eventAccessor = eventSymbol?.RemoveMethod + Else + eventAccessor = Nothing + End If + + If eventAccessor Is Nothing Then + Return False + End If Using ExpressionStatementTag(GetLineNumber(addHandlerStatement)) Using ExpressionTag() Using MethodCallTag() - Dim eventExpression = addHandlerStatement.EventExpression - Dim eventSymbol = TryCast(SemanticModel.GetSymbolInfo(eventExpression).Symbol, IEventSymbol) - - If eventSymbol?.AddMethod Is Nothing Then - Return False - End If - - If Not TryGenerateExpression(eventExpression, eventSymbol.AddMethod, generateAttributes:=True) Then + If Not TryGenerateExpression(eventExpression, eventAccessor, generateAttributes:=True) Then Return False End If -- GitLab