' 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.Operations Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Partial Public Class IOperationTests Inherits SemanticModelTestBase Public Sub InvalidUserDefinedOperators() Dim source = Dim comp = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature) Dim tree = comp.SyntaxTrees.Single() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetRoot().DescendantNodes().OfType(Of AssignmentStatementSyntax).ToArray() Assert.Equal(nodes.Length, 3) ' x = x + 10 fails semantic analysis and does not have an operator method, but the operands are available. Assert.Equal("x = x + 10", nodes(0).ToString()) Dim statement1 As IOperation = model.GetOperation(nodes(0)) Assert.Equal(statement1.Kind, OperationKind.ExpressionStatement) Dim expression1 As IOperation = DirectCast(statement1, IExpressionStatementOperation).Operation Assert.Equal(expression1.Kind, OperationKind.SimpleAssignment) Dim assignment1 As ISimpleAssignmentOperation = DirectCast(expression1, ISimpleAssignmentOperation) Assert.Equal(assignment1.Value.Kind, OperationKind.BinaryOperator) Dim add1 As IBinaryOperation = DirectCast(assignment1.Value, IBinaryOperation) Assert.Equal(add1.OperatorKind, Operations.BinaryOperatorKind.Add) Assert.Null(add1.OperatorMethod) Dim left1 As IOperation = add1.LeftOperand Assert.Equal(left1.Kind, OperationKind.LocalReference) Assert.Equal(DirectCast(left1, ILocalReferenceOperation).Local.Name, "x") Dim right1 As IOperation = add1.RightOperand Assert.Equal(right1.Kind, OperationKind.Literal) Dim literal1 As ILiteralOperation = DirectCast(right1, ILiteralOperation) Assert.Equal(CInt(literal1.ConstantValue.Value), 10) comp.VerifyOperationTree(nodes(0), expectedOperationTree:=" IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid) (Syntax: 'x = x + 10') Expression: ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: B2, IsInvalid, IsImplicit) (Syntax: 'x = x + 10') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2) (Syntax: 'x') Right: IBinaryOperation (BinaryOperatorKind.Add, Checked) (OperationKind.BinaryOperator, Type: B2, IsInvalid) (Syntax: 'x + 10') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2) (Syntax: 'x') Right: ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 10, IsInvalid) (Syntax: '10')") ' x = x + y passes semantic analysis. Assert.Equal("x = x + y", nodes(1).ToString()) Dim statement2 As IOperation = model.GetOperation(nodes(1)) Assert.Equal(statement2.Kind, OperationKind.ExpressionStatement) Dim expression2 As IOperation = DirectCast(statement2, IExpressionStatementOperation).Operation Assert.Equal(expression2.Kind, OperationKind.SimpleAssignment) Dim assignment2 As ISimpleAssignmentOperation = DirectCast(expression2, ISimpleAssignmentOperation) Assert.Equal(assignment2.Value.Kind, OperationKind.BinaryOperator) Dim add2 As IBinaryOperation = DirectCast(assignment2.Value, IBinaryOperation) Assert.Equal(add2.OperatorKind, Operations.BinaryOperatorKind.Add) Assert.NotNull(add2.OperatorMethod) Assert.Equal(add2.OperatorMethod.Name, "op_Addition") Dim left2 As IOperation = add2.LeftOperand Assert.Equal(left2.Kind, OperationKind.LocalReference) Assert.Equal(DirectCast(left2, ILocalReferenceOperation).Local.Name, "x") Dim right2 As IOperation = add2.RightOperand Assert.Equal(right2.Kind, OperationKind.LocalReference) Assert.Equal(DirectCast(right2, ILocalReferenceOperation).Local.Name, "y") comp.VerifyOperationTree(nodes(1), expectedOperationTree:=" IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'x = x + y') Expression: ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: B2, IsImplicit) (Syntax: 'x = x + y') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2) (Syntax: 'x') Right: IBinaryOperation (BinaryOperatorKind.Add, Checked) (OperatorMethod: Function B2.op_Addition(x As B2, y As B2) As B2) (OperationKind.BinaryOperator, Type: B2) (Syntax: 'x + y') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2) (Syntax: 'x') Right: ILocalReferenceOperation: y (OperationKind.LocalReference, Type: B2) (Syntax: 'y')") ' -x fails semantic analysis and does not have an operator method, but the operand is available. Assert.Equal("x = -x", nodes(2).ToString()) Dim statement3 As IOperation = model.GetOperation(nodes(2)) Assert.Equal(statement3.Kind, OperationKind.ExpressionStatement) Dim expression3 As IOperation = DirectCast(statement3, IExpressionStatementOperation).Operation Assert.Equal(expression3.Kind, OperationKind.SimpleAssignment) Dim assignment3 As ISimpleAssignmentOperation = DirectCast(expression3, ISimpleAssignmentOperation) Assert.Equal(assignment3.Value.Kind, OperationKind.UnaryOperator) Dim negate3 As IUnaryOperation = DirectCast(assignment3.Value, IUnaryOperation) Assert.Equal(negate3.OperatorKind, Operations.UnaryOperatorKind.Minus) Assert.Null(negate3.OperatorMethod) Dim operand3 As IOperation = negate3.Operand Assert.Equal(operand3.Kind, OperationKind.LocalReference) Assert.Equal(DirectCast(operand3, ILocalReferenceOperation).Local.Name, "x") comp.VerifyOperationTree(nodes(2), expectedOperationTree:=" IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid) (Syntax: 'x = -x') Expression: ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: B2, IsInvalid, IsImplicit) (Syntax: 'x = -x') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2) (Syntax: 'x') Right: IUnaryOperation (UnaryOperatorKind.Minus) (OperationKind.UnaryOperator, Type: B2, IsInvalid) (Syntax: '-x') Operand: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: B2, IsInvalid) (Syntax: 'x')") End Sub Public Sub SimpleCompoundAssignment() Dim source = Dim comp = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature) Dim tree = comp.SyntaxTrees.Single() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetRoot().DescendantNodes().OfType(Of AssignmentStatementSyntax).ToArray() Assert.Equal(nodes.Length, 2) ' x += y produces a compound assignment with an integer add. Assert.Equal("x += y", nodes(0).ToString()) Dim statement1 As IOperation = model.GetOperation(nodes(0)) Assert.Equal(statement1.Kind, OperationKind.ExpressionStatement) Dim expression1 As IOperation = DirectCast(statement1, IExpressionStatementOperation).Operation Assert.Equal(expression1.Kind, OperationKind.CompoundAssignment) Dim assignment1 As ICompoundAssignmentOperation = DirectCast(expression1, ICompoundAssignmentOperation) Dim target1 As ILocalReferenceOperation = TryCast(assignment1.Target, ILocalReferenceOperation) Assert.NotNull(target1) Assert.Equal(target1.Local.Name, "x") Dim value1 As ILocalReferenceOperation = TryCast(assignment1.Value, ILocalReferenceOperation) Assert.NotNull(value1) Assert.Equal(value1.Local.Name, "y") Assert.Equal(assignment1.OperatorKind, Operations.BinaryOperatorKind.Add) Assert.Null(assignment1.OperatorMethod) comp.VerifyOperationTree(nodes(0), expectedOperationTree:=" IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'x += y') Expression: ICompoundAssignmentOperation (BinaryOperatorKind.Add, Checked) (OperationKind.CompoundAssignment, Type: System.Int32, IsImplicit) (Syntax: 'x += y') Left: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'x') Right: ILocalReferenceOperation: y (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'y')") ' a += b produces a compound assignment with an operator method add. Assert.Equal("a += b", nodes(1).ToString()) Dim statement2 As IOperation = model.GetOperation(nodes(1)) Assert.Equal(statement2.Kind, OperationKind.ExpressionStatement) Dim expression2 As IOperation = DirectCast(statement2, IExpressionStatementOperation).Operation Assert.Equal(expression2.Kind, OperationKind.CompoundAssignment) Dim assignment2 As ICompoundAssignmentOperation = DirectCast(expression2, ICompoundAssignmentOperation) Dim target2 As ILocalReferenceOperation = TryCast(assignment2.Target, ILocalReferenceOperation) Assert.NotNull(target2) Assert.Equal(target2.Local.Name, "a") Dim value2 As ILocalReferenceOperation = TryCast(assignment2.Value, ILocalReferenceOperation) Assert.NotNull(value2) Assert.Equal(value2.Local.Name, "b") Assert.Equal(assignment2.OperatorKind, Operations.BinaryOperatorKind.Add) Assert.NotNull(assignment2.OperatorMethod) Assert.Equal(assignment2.OperatorMethod.Name, "op_Addition") comp.VerifyOperationTree(nodes(1), expectedOperationTree:=" IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'a += b') Expression: ICompoundAssignmentOperation (BinaryOperatorKind.Add, Checked) (OperatorMethod: Function B2.op_Addition(x As B2, y As B2) As B2) (OperationKind.CompoundAssignment, Type: B2, IsImplicit) (Syntax: 'a += b') Left: ILocalReferenceOperation: a (OperationKind.LocalReference, Type: B2) (Syntax: 'a') Right: ILocalReferenceOperation: b (OperationKind.LocalReference, Type: B2) (Syntax: 'b')") End Sub Public Sub VerifyOperationTree_IfStatement() Dim source = 0 Then'BIND:"If x <> 0 Then" System.Console.Write(x) End If End Sub End Class ]]>.Value Dim expectedOperationTree = 0 T ... End If') Condition: IBinaryOperation (BinaryOperatorKind.NotEquals, Checked) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'x <> 0') Left: IParameterReferenceOperation: x (OperationKind.ParameterReference, Type: System.Int32) (Syntax: 'x') Right: ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0') WhenTrue: IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsImplicit) (Syntax: 'If x <> 0 T ... End If') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'System.Console.Write(x)') Expression: IInvocationOperation (Sub System.Console.Write(value As System.Int32)) (OperationKind.Invocation, Type: System.Void) (Syntax: 'System.Console.Write(x)') Instance Receiver: null Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument, Type: null) (Syntax: 'x') IParameterReferenceOperation: x (OperationKind.ParameterReference, Type: System.Int32) (Syntax: 'x') InConversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) OutConversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) WhenFalse: null ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineIfBlockSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub VerifyOperationTree_ForStatement() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ForBlockSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub NothingOrAddressOfInPlaceOfParamArray() Dim source = Dim comp = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(source, parseOptions:=TestOptions.RegularWithIOperationFeature) Dim tree = comp.SyntaxTrees.Single() comp.AssertTheseDiagnostics( BC30311: Value of type 'Guid' cannot be converted to 'Integer'. Test2(New System.Guid(), Nothing) ~~~~~~~~~~~~~~~~~ BC30581: 'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type. Test1(AddressOf Main) ~~~~~~~~~~~~~~ BC30311: Value of type 'Guid' cannot be converted to 'Integer'. Test2(New System.Guid(), AddressOf Main) ~~~~~~~~~~~~~~~~~ BC30581: 'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type. Test2(New System.Guid(), AddressOf Main) ~~~~~~~~~~~~~~ ) Dim nodes = tree.GetRoot().DescendantNodes().OfType(Of InvocationExpressionSyntax)().ToArray() comp.VerifyOperationTree(nodes(0), expectedOperationTree:= "IInvocationOperation (Sub Module1.Test1(ParamArray x As System.Int32())) (OperationKind.Invocation, Type: System.Void) (Syntax: 'Test1(Nothing)') Instance Receiver: null Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument, Type: null) (Syntax: 'Nothing') IConversionOperation (TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Int32(), Constant: null, IsImplicit) (Syntax: 'Nothing') Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) Operand: ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'Nothing') InConversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) OutConversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)") comp.VerifyOperationTree(nodes(1), expectedOperationTree:= "IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid) (Syntax: 'Test2(New S ... ), Nothing)') Children(3): IOperation: (OperationKind.None, Type: null) (Syntax: 'Test2') Children(1): IInstanceReferenceOperation (OperationKind.InstanceReference, Type: Module1, IsImplicit) (Syntax: 'Test2') IObjectCreationOperation (Constructor: Sub System.Guid..ctor()) (OperationKind.ObjectCreation, Type: System.Guid, IsInvalid) (Syntax: 'New System.Guid()') Arguments(0) Initializer: null ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'Nothing')") comp.VerifyOperationTree(nodes(2), expectedOperationTree:= "IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid) (Syntax: 'Test1(AddressOf Main)') Children(2): IOperation: (OperationKind.None, Type: null) (Syntax: 'Test1') Children(1): IInstanceReferenceOperation (OperationKind.InstanceReference, Type: Module1, IsImplicit) (Syntax: 'Test1') IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'AddressOf Main') Children(1): IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'Main') Children(1): IInstanceReferenceOperation (OperationKind.InstanceReference, Type: Module1, IsInvalid, IsImplicit) (Syntax: 'Main')") comp.VerifyOperationTree(nodes(3), expectedOperationTree:= "IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid) (Syntax: 'Test2(New S ... essOf Main)') Children(3): IOperation: (OperationKind.None, Type: null) (Syntax: 'Test2') Children(1): IInstanceReferenceOperation (OperationKind.InstanceReference, Type: Module1, IsImplicit) (Syntax: 'Test2') IObjectCreationOperation (Constructor: Sub System.Guid..ctor()) (OperationKind.ObjectCreation, Type: System.Guid, IsInvalid) (Syntax: 'New System.Guid()') Arguments(0) Initializer: null IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'AddressOf Main') Children(1): IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'Main') Children(1): IInstanceReferenceOperation (OperationKind.InstanceReference, Type: Module1, IsInvalid, IsImplicit) (Syntax: 'Main')") End Sub Public Sub BoundMethodGroup_ExposesReceiver() Dim source = .Value Dim expectedOperationTree = , IsInvalid) (Syntax: 'New With {K ... essOf c1.S}') Initializers(1): ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: ?, IsInvalid) (Syntax: 'Key .a = AddressOf c1.S') Left: IPropertyReferenceOperation: ReadOnly Property .a As ? (OperationKind.PropertyReference, Type: ?) (Syntax: 'a') Instance Receiver: null Right: IInvalidOperation (OperationKind.Invalid, Type: ?, IsInvalid, IsImplicit) (Syntax: 'AddressOf c1.S') Children(1): IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'AddressOf c1.S') Children(1): IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'c1.S') Children(1): IOperation: (OperationKind.None, Type: null, 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 Public Sub TestClone() Dim sourceCode = TestResource.AllInOneVisualBasicCode Dim fileName = "a.vb" Dim syntaxTree = Parse(sourceCode, fileName, options:=Nothing) Dim compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, DefaultVbReferences.Concat({ValueTupleRef, SystemRuntimeFacadeRef})) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim model = compilation.GetSemanticModel(tree) VerifyClone(model) End Sub Public Sub TestParentOperations() Dim sourceCode = TestResource.AllInOneVisualBasicCode Dim fileName = "a.vb" Dim syntaxTree = Parse(sourceCode, fileName, options:=Nothing) Dim compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, DefaultVbReferences.Concat({ValueTupleRef, SystemRuntimeFacadeRef})) Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = fileName).Single() Dim model = compilation.GetSemanticModel(tree) VerifyParentOperations(model) End Sub Public Sub TestEndStatement() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of StopOrEndStatementSyntax)(source, expectedOperationTree, expectedDiagnostics, compilationOptions:=TestOptions.ReleaseExe) End Sub Public Sub TestEndStatement_Parent() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineIfBlockSyntax)(source, expectedOperationTree, expectedDiagnostics, compilationOptions:=TestOptions.ReleaseExe) End Sub Public Sub TestStopStatement() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of StopOrEndStatementSyntax)(source, expectedOperationTree, expectedDiagnostics, compilationOptions:=TestOptions.ReleaseExe) End Sub Public Sub TestStopStatement_Parent() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineIfBlockSyntax)(source, expectedOperationTree, expectedDiagnostics, compilationOptions:=TestOptions.ReleaseExe) End Sub Public Sub TestCatchClause() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of CatchBlockSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub TestSubSingleLineLambda() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of SingleLineLambdaExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub TestFunctionSingleLineLambda() Dim source = .Value Dim expectedOperationTree = As System.Int32 IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: '1') ReturnedValue: ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1') ILabeledOperation (Label: exit) (OperationKind.Labeled, Type: null, IsImplicit) (Syntax: 'Function() 1') Statement: null IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'Function() 1') ReturnedValue: ILocalReferenceOperation: (OperationKind.LocalReference, Type: System.Int32, IsImplicit) (Syntax: 'Function() 1') ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of SingleLineLambdaExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub TestFunctionMultiLineLambda() Dim source = .Value Dim expectedOperationTree = As System.Int32 IReturnOperation (OperationKind.Return, Type: null) (Syntax: 'Return 1') ReturnedValue: ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1') ILabeledOperation (Label: exit) (OperationKind.Labeled, Type: null, IsImplicit) (Syntax: 'End Function') Statement: null IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'End Function') ReturnedValue: ILocalReferenceOperation: (OperationKind.LocalReference, Type: System.Int32, IsImplicit) (Syntax: 'End Function') ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineLambdaExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub TestSubMultiLineLambda() Dim source = .Value Dim expectedOperationTree = .Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of MultiLineLambdaExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub TestGetOperationForQualifiedName() Dim source = .Value Dim comp = CreateVisualBasicCompilation(source, parseOptions:=TestOptions.RegularWithIOperationFeature) Dim tree = comp.SyntaxTrees.Single() Dim model = comp.GetSemanticModel(tree) ' Verify we return non-null operation only for topmost member access expression. Dim expr = CompilationUtils.FindBindingText(Of MemberAccessExpressionSyntax)(comp, tree.FilePath) Assert.Equal("a.b", expr.ToString()) Dim operation = model.GetOperation(expr) Assert.NotNull(operation) Assert.Equal(OperationKind.FieldReference, operation.Kind) Dim fieldOperation = DirectCast(operation, IFieldReferenceOperation) Assert.Equal("b", fieldOperation.Field.Name) ' Verify we return null operation for child nodes of member access expression. Assert.Null(model.GetOperation(expr.Name)) End Sub End Class End Namespace