diff --git a/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb b/src/Compilers/VisualBasic/Portable/BoundTree/Expression.vb index 44856f96da800041adc677aedd8ba3993dd1d84f..9e56212295ae2784793ea7afa813042e7605be85 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,26 @@ 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 BoundMethodOrPropertyGroup + 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/Test/Semantic/Binding/BindingCollectionInitializerTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb index 074d195acbe4a611cc82b7c61df6981b6fddab46..1d6fda485e2406ae342512dee00ed4d887ea4fa3 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 a5ed36d15ce8524a4e28bd0a56061ec224acde21..c94ab24b3d2e3f69c7e51049ec3dd2195bba24da 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 67badd2dbbad7cbcb03334525cf16989bdf16969..9ead5c7ad5757ed15c4fc4de2afb10bd5b416b02 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests.vb @@ -354,6 +354,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 @@ -363,16 +365,114 @@ 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 BoundMethodGroup_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 + + + + Public Sub BoundPropertyGroup_ExposesReceiver() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = .Value + + VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(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 d77d9c962a7589cc07e9a369f3cfd989da3080f4..12fc5b0dcb1e8dfc029d03d6e4f72b8e30737545 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 839a58989a551f5cc0b16fec70af62732735660d..142856d7260e496a0217ae3a76b302b5a1ea560a 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.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.VisualBasic.Syntax @@ -1030,6 +1030,10 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf M2') Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) 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 IInvalidExpression (OperationKind.InvalidExpression, Type: System.Void, IsInvalid) (Syntax: 'M2(d)') Children(2): IOperation: (OperationKind.None, IsInvalid) (Syntax: 'M2') + Children(1): + IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C, IsInvalid) (Syntax: 'M2') IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: System.Object) (Syntax: 'd') ]]>.Value @@ -415,6 +417,8 @@ End Class]]>.Value IInvalidExpression (OperationKind.InvalidExpression, Type: System.Int32, IsInvalid) (Syntax: 'c(c, d)') Children(3): IOperation: (OperationKind.None, IsInvalid) (Syntax: 'c') + Children(1): + IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C, IsInvalid) (Syntax: 'c') IParameterReferenceExpression: c (OperationKind.ParameterReferenceExpression, Type: C) (Syntax: 'c') IParameterReferenceExpression: d (OperationKind.ParameterReferenceExpression, Type: System.Object) (Syntax: 'd') ]]>.Value diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IEventAssignmentExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IEventAssignmentExpression.vb index 3fb67913e4fba4390448f335fa2c34506995e5f0..3b041b4e376d3d7bd2d5a04efaed2d5eb5ccbf83 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IEventAssignmentExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IEventAssignmentExpression.vb @@ -167,6 +167,10 @@ IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'Re Handler: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf M') Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) 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 = .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 26748218b5045302d728ed076de4c0cdf0432ba1..a3787b04cb3c195f8bed845d3111dc416601fd63 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb @@ -812,6 +812,10 @@ IAnonymousObjectCreationExpression (OperationKind.AnonymousObjectCreationExpress Right: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'AddressOf S') Children(1): 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 =