提交 1fee560e 编写于 作者: D Dustin Campbell

Add support for RemoveHandler statements in IMethodXML generation

上级 aec42746
......@@ -340,5 +340,340 @@ End Class
Test(definition, expected)
End Sub
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModelMethodXml)>
Public Sub VBStatements_RemoveHandler1()
Dim definition =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true" AssemblyName="Test">
<CompilationOptions RootNamespace="N"/>
<Document>
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
</Document>
</Project>
</Workspace>
Dim expected =
<Block>
<ExpressionStatement line="10">
<Expression>
<MethodCall>
<Expression>
<NameRef variablekind="method" name="remove_E">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
<Argument>
<Expression>
<NewDelegate name="Handler">
<Type implicit="yes">System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>
<Expression>
<ThisReference/>
</Expression>
<Type implicit="yes">N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
</NewDelegate>
</Expression>
</Argument>
</MethodCall>
</Expression>
</ExpressionStatement>
</Block>
Test(definition, expected)
End Sub
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModelMethodXml)>
Public Sub VBStatements_RemoveHandler2()
Dim definition =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true" AssemblyName="Test">
<CompilationOptions RootNamespace="N"/>
<Document>
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
</Document>
</Project>
</Workspace>
Dim expected =
<Block>
<ExpressionStatement line="14">
<Expression>
<MethodCall>
<Expression>
<NameRef variablekind="method" name="remove_E">
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
<Argument>
<Expression>
<NewDelegate name="Handler">
<Type implicit="yes">System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>
<Expression>
<ThisReference/>
</Expression>
<Type implicit="yes">N.C, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
</NewDelegate>
</Expression>
</Argument>
</MethodCall>
</Expression>
</ExpressionStatement>
</Block>
Test(definition, expected)
End Sub
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModelMethodXml)>
Public Sub VBStatements_RemoveHandler3()
Dim definition =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true" AssemblyName="Test">
<CompilationOptions RootNamespace="N"/>
<Document>
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
</Document>
</Project>
</Workspace>
Dim expected =
<Block>
<ExpressionStatement line="14">
<Expression>
<MethodCall>
<Expression>
<NameRef variablekind="method" name="remove_E">
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
<Argument>
<Expression>
<NewDelegate name="Handler">
<Type implicit="yes">System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
</NewDelegate>
</Expression>
</Argument>
</MethodCall>
</Expression>
</ExpressionStatement>
</Block>
Test(definition, expected)
End Sub
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModelMethodXml)>
Public Sub VBStatements_RemoveHandler4()
Dim definition =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true" AssemblyName="Test">
<CompilationOptions RootNamespace="N"/>
<Document>
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
</Document>
</Project>
</Workspace>
Dim expected =
<Block>
<ExpressionStatement line="18">
<Expression>
<MethodCall>
<Expression>
<NameRef variablekind="method" name="remove_E">
<Expression>
<NameRef variablekind="property" name="A" fullname="N.B.A">
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.A, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
<Argument>
<Expression>
<NewDelegate name="Handler">
<Type implicit="yes">System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
</NewDelegate>
</Expression>
</Argument>
</MethodCall>
</Expression>
</ExpressionStatement>
</Block>
Test(definition, expected)
End Sub
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModelMethodXml)>
Public Sub VBStatements_RemoveHandler5()
Dim definition =
<Workspace>
<Project Language="Visual Basic" CommonReferences="true" AssemblyName="Test">
<CompilationOptions RootNamespace="N"/>
<Document>
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
</Document>
</Project>
</Workspace>
Dim expected =
<Block>
<ExpressionStatement line="18">
<Expression>
<MethodCall>
<Expression>
<NameRef variablekind="method" name="remove_E">
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.B, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
<Argument>
<Expression>
<NewDelegate name="Handler">
<Type implicit="yes">System.EventHandler, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</Type>
<Expression>
<NameRef variablekind="property" name="A" fullname="N.B.A">
<Expression>
<NameRef variablekind="field" name="b" fullname="N.C.b">
<Expression>
<ThisReference/>
</Expression>
</NameRef>
</Expression>
</NameRef>
</Expression>
<Type implicit="yes">N.A, Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</Type>
</NewDelegate>
</Expression>
</Argument>
</MethodCall>
</Expression>
</ExpressionStatement>
</Block>
Test(definition, expected)
End Sub
End Class
End Namespace
\ No newline at end of file
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册