Added support for reciever children in BoundMethodGroup and BoundPropertyGroup

上级 7ca74950
' 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 System.Collections.Immutable
Imports Microsoft.CodeAnalysis.PooledObjects
Imports Microsoft.CodeAnalysis.Semantics
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Namespace Microsoft.CodeAnalysis.VisualBasic
Friend Partial Class BoundBadExpression
......@@ -22,6 +19,44 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Property
End Class
Partial Friend Class BoundAddressOfOperator
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
Return ImmutableArray.Create(Of BoundNode)(Me.MethodGroup)
End Get
End Property
End Class
Partial Friend Class BoundMethodGroup
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
Dim builder = ImmutableArray.CreateBuilder(Of BoundNode)
If Me.ReceiverOpt IsNot Nothing Then
builder.Add(Me.ReceiverOpt)
End If
If Me.TypeArgumentsOpt IsNot Nothing Then
builder.Add(Me.TypeArgumentsOpt)
End If
Return builder.ToImmutable()
End Get
End Property
End Class
Partial Friend Class BoundPropertyGroup
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
If Me.ReceiverOpt IsNot Nothing Then
Return ImmutableArray.Create(Of BoundNode)(Me.ReceiverOpt)
Else
Return ImmutableArray(Of BoundNode).Empty
End If
End Get
End Property
End Class
Friend Partial Class BoundNullableIsTrueOperator
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
......
......@@ -29,26 +29,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Property
End Class
Partial Friend Class BoundAddressOfOperator
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
Return ImmutableArray.Create(Of BoundNode)(Me.MethodGroup)
End Get
End Property
End Class
Partial Friend Class BoundMethodGroup
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
If Me.TypeArgumentsOpt IsNot Nothing Then
Return ImmutableArray.Create(Of BoundNode)(Me.TypeArgumentsOpt)
Else
Return ImmutableArray(Of BoundNode).Empty
End If
End Get
End Property
End Class
Partial Friend Class BoundCaseBlock
Protected Overrides ReadOnly Property Children As ImmutableArray(Of BoundNode)
Get
......
......@@ -701,10 +701,14 @@ IObjectOrCollectionInitializerExpression (OperationKind.ObjectOrCollectionInitia
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: '"Hello World!"')
Children(2):
IOperation: (OperationKind.None, IsInvalid) (Syntax: '"Hello World!"')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'New C2() Fr ... r element"}')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "Hello World!", IsInvalid) (Syntax: '"Hello World!"')
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: '"Errors wil ... er element"')
Children(2):
IOperation: (OperationKind.None, IsInvalid) (Syntax: '"Errors wil ... er element"')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'New C2() Fr ... r element"}')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "Errors will be shown for each initializer element", IsInvalid) (Syntax: '"Errors wil ... er element"')
]]>.Value
......@@ -1107,6 +1111,8 @@ IObjectCreationExpression (Constructor: Sub System.Collections.Generic.Dictionar
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: '{1}')
Children(2):
IOperation: (OperationKind.None, IsInvalid) (Syntax: '{1}')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'New Diction ... From {{1}}')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1')
]]>.Value
......
......@@ -582,6 +582,8 @@ IObjectCreationExpression (Constructor: Sub C1..ctor()) (OperationKind.ObjectCre
Left: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '.Goo = "Hello World!"')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'Goo')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'New C1() Wi ... lo World!"}')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: ?) (Syntax: '"Hello World!"')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "Hello World!") (Syntax: '"Hello World!"')
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
' 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.Semantics
Imports Microsoft.CodeAnalysis.Test.Utilities
......@@ -361,6 +361,8 @@ BC30581: 'AddressOf' expression cannot be converted to 'Integer' because 'Intege
"IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'Test2(New S ... ), Nothing)')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'Test2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Module1) (Syntax: 'Test2')
IObjectCreationExpression (Constructor: Sub System.Guid..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Guid, IsInvalid) (Syntax: 'New System.Guid()')
Arguments(0)
Initializer: null
......@@ -370,16 +372,69 @@ BC30581: 'AddressOf' expression cannot be converted to 'Integer' because 'Intege
"IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'Test1(AddressOf Main)')
Children(2):
IOperation: (OperationKind.None) (Syntax: 'Test1')
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf Main')")
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Module1) (Syntax: 'Test1')
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf Main')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'Main')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Module1, IsInvalid) (Syntax: 'Main')")
comp.VerifyOperationTree(nodes(3), expectedOperationTree:=
"IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'Test2(New S ... essOf Main)')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'Test2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Module1) (Syntax: 'Test2')
IObjectCreationExpression (Constructor: Sub System.Guid..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Guid, IsInvalid) (Syntax: 'New System.Guid()')
Arguments(0)
Initializer: null
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf Main')")
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf Main')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'Main')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Module1, IsInvalid) (Syntax: 'Main')")
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
<Fact()>
Public Sub AddressOf_BoundMethodOrPropertyGroup_ExposesReceiver()
Dim source = <![CDATA[
Imports System
Module Program
Sub Main(args As String())
Dim c1 As New C1
Console.WriteLine(New With {Key .a = AddressOf c1.S})'BIND:"New With {Key .a = AddressOf c1.S}"
End Sub
Class C1
Sub S()
End Sub
End Class
End Module]]>.Value
Dim expectedOperationTree = <![CDATA[
IAnonymousObjectCreationExpression (OperationKind.AnonymousObjectCreationExpression, Type: <anonymous type: Key a As ?>, IsInvalid) (Syntax: 'New With {K ... essOf c1.S}')
Initializers(1):
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: ?, IsInvalid) (Syntax: 'Key .a = AddressOf c1.S')
Left: IPropertyReferenceExpression: ReadOnly Property <anonymous type: Key a As ?>.a As ? (Static) (OperationKind.PropertyReferenceExpression, Type: ?) (Syntax: 'a')
Instance Receiver: null
Right: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'AddressOf c1.S')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf c1.S')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'c1.S')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'c1')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
BC30491: Expression does not produce a value.
Console.WriteLine(New With {Key .a = AddressOf c1.S})'BIND:"New With {Key .a = AddressOf c1.S}"
~~~~~~~~~~~~~~
]]>.Value
VerifyOperationTreeAndDiagnosticsForTest(Of AnonymousObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
End Sub
<CompilerTrait(CompilerFeature.IOperation)>
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
' 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.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.Test.Utilities
......@@ -665,6 +665,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2()')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P, IsInvalid) (Syntax: 'M2')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......@@ -693,6 +695,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(1, 2)')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'M2')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2, IsInvalid) (Syntax: '2')
]]>.Value
......@@ -723,6 +727,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(0,,,)')
Children(5):
IOperation: (OperationKind.None) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'M2')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IOmittedArgumentExpression (OperationKind.OmittedArgumentExpression, Type: null) (Syntax: '')
IOmittedArgumentExpression (OperationKind.OmittedArgumentExpression, Type: null) (Syntax: '')
......@@ -755,6 +761,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(0, )')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'M2')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IOmittedArgumentExpression (OperationKind.OmittedArgumentExpression, Type: null, IsInvalid) (Syntax: '')
]]>.Value
......@@ -786,6 +794,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(x:=0, array:=a)')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'M2')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
ILocalReferenceExpression: a (OperationKind.LocalReferenceExpression, Type: System.Int32()) (Syntax: 'a')
]]>.Value
......@@ -816,6 +826,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(y:=1)')
Children(2):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: P, IsInvalid) (Syntax: 'M2')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
]]>.Value
......@@ -962,6 +974,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(x)')
Children(2):
IOperation: (OperationKind.None) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Program) (Syntax: 'M2')
ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: C, IsInvalid) (Syntax: 'x')
]]>.Value
......
......@@ -1032,6 +1032,8 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Operand: IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf M2')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Program, IsInvalid) (Syntax: 'M2')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......@@ -1123,6 +1125,8 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Operand: IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf M2')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M2')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Program, IsInvalid) (Syntax: 'M2')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......@@ -1183,7 +1187,7 @@ Module Program
End Sub
End Module]]>.Value
Dim expectedOperationTree = <![CDATA[
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ar ... teger(1) {}')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a')
Variables: Local_1: a As System.Array
......@@ -1216,7 +1220,7 @@ Module Program
End Sub
End Module]]>.Value
Dim expectedOperationTree = <![CDATA[
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ar ... ger(1)() {}')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a')
Variables: Local_1: a As System.Array
......@@ -1676,7 +1680,7 @@ Module Program
End Sub
End Module]]>.Value
Dim expectedOperationTree = <![CDATA[
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim s1 As S ... Char(1) {}')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 's1')
Variables: Local_1: s1 As System.String
......@@ -2094,7 +2098,7 @@ Module Module1
End Module
]]>.Value
Dim expectedOperationTree = <![CDATA[
Dim expectedOperationTree = <![CDATA[
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim expr As ... um) num < 5')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'expr')
Variables: Local_1: expr As System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean))
......@@ -2368,6 +2372,14 @@ Module M1
End Module]]>.Value
Dim expectedOperationTree = <![CDATA[
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action(Of System.String), IsInvalid) (Syntax: 'AddressOf M ... (Of String)')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand: IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf M ... (Of String)')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'Method2(Of String)')
Children(2):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: M1, IsInvalid) (Syntax: 'Method2(Of String)')
IOperation: (OperationKind.None, IsInvalid) (Syntax: '(Of String)')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......
......@@ -169,6 +169,8 @@ IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'Re
Operand: IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf M')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: TestClass, IsInvalid) (Syntax: 'M')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......
......@@ -873,9 +873,13 @@ IWhileUntilLoopStatement (IsTopTest: True, IsWhile: True) (LoopKind.WhileUntil)
Left: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'System.Math ... (x), x + 1)')
Children(3):
IOperation: (OperationKind.None) (Syntax: 'System.Math.Max')
Children(1):
IOperation: (OperationKind.None) (Syntax: 'System.Math')
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'System.Thre ... ecrement(x)')
Children(2):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'System.Thre ... d.Decrement')
Children(1):
IOperation: (OperationKind.None) (Syntax: 'System.Thre ... Interlocked')
ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: System.SByte) (Syntax: 'x')
IBinaryOperatorExpression (BinaryOperatorKind.Add, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Int32) (Syntax: 'x + 1')
Left: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Int32) (Syntax: 'x')
......
......@@ -91,6 +91,8 @@ End Class]]>.Value
IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'F(String.Empty)')
Children(2):
IOperation: (OperationKind.None) (Syntax: 'F')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Program) (Syntax: 'F')
IFieldReferenceExpression: System.String.Empty As System.String (Static) (OperationKind.FieldReferenceExpression, Type: System.String, IsInvalid) (Syntax: 'String.Empty')
Instance Receiver: null
]]>.Value
......
......@@ -814,6 +814,8 @@ IAnonymousObjectCreationExpression (OperationKind.AnonymousObjectCreationExpress
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'AddressOf S')
Children(1):
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'S')
Children(1):
IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: Program, IsInvalid) (Syntax: 'S')
]]>.Value
Dim expectedDiagnostics = <![CDATA[
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册