From 0fda54719f444e7c22823bca70c47a23613d952e Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Mon, 18 Sep 2017 11:44:45 -0400 Subject: [PATCH] Added support for reciever children in BoundMethodGroup and BoundPropertyGroup --- .../Portable/BoundTree/Expression.vb | 41 ++++++++++++- .../Portable/BoundTree/Statement.vb | 20 ------ .../BindingCollectionInitializerTests.vb | 6 ++ .../Binding/BindingObjectInitializerTests.vb | 2 + .../Semantic/IOperation/IOperationTests.vb | 61 ++++++++++++++++++- .../IOperation/IOperationTests_IArgument.vb | 16 ++++- .../IOperationTests_IConversionExpression.vb | 20 ++++-- ...erationTests_IEventAssignmentExpression.vb | 2 + ...OperationTests_IWhileUntilLoopStatement.vb | 4 ++ .../IOperationTests_InvalidExpression.vb | 2 + .../Semantic/Semantics/AnonymousTypesTests.vb | 2 + 11 files changed, 145 insertions(+), 31 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb b/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb index 44856f96da8..daf7c5b85ef 100644 --- a/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb +++ b/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb @@ -1,9 +1,6 @@ ' 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 diff --git a/src/Compilers/VisualBasic/Portable/BoundTree/Statement.vb b/src/Compilers/VisualBasic/Portable/BoundTree/Statement.vb index a4984a268dc..92bd7f4bc8c 100644 --- a/src/Compilers/VisualBasic/Portable/BoundTree/Statement.vb +++ b/src/Compilers/VisualBasic/Portable/BoundTree/Statement.vb @@ -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 diff --git a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb index 074d195acbe..1d6fda485e2 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb @@ -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 diff --git a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb index a5ed36d15ce..c94ab24b3d2 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb @@ -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!"') diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb index c675edfcd5e..a2ccb2cf264 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb @@ -1,4 +1,4 @@ -' 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 + + + + Public Sub AddressOf_BoundMethodOrPropertyGroup_ExposesReceiver() + Dim source = .Value + + Dim expectedOperationTree = , 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 .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 = .Value + + VerifyOperationTreeAndDiagnosticsForTest(Of AnonymousObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IArgument.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IArgument.vb index d77d9c962a7..12fc5b0dcb1 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IArgument.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IArgument.vb @@ -1,4 +1,4 @@ -' 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 = .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 diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb index e6440b61249..344ce3baccf 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb @@ -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 = .Value Dim expectedDiagnostics = .Value -Dim expectedOperationTree = .Value -Dim expectedOperationTree = .Value -Dim expectedOperationTree = .Value -Dim expectedOperationTree = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = .Value Dim expectedDiagnostics = .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 diff --git a/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb index 3c2fdab0b65..a3787b04cb3 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb @@ -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 =