IOperationTests_IDynamicMemberReferenceExpression.vb 15.7 KB
Newer Older
1 2 3
' 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
J
Jinu 已提交
4
Imports Microsoft.CodeAnalysis.Test.Utilities
F
Fredric Silberberg 已提交
5 6 7 8 9

Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics

    Partial Public Class IOperationTests
        Inherits SemanticModelTestBase
J
Jinu 已提交
10
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
11 12 13 14 15 16 17
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_SimplePropertyAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
18
        d.F'BIND:"d.F"
F
Fredric Silberberg 已提交
19 20 21 22 23
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
24
IOperation:  (OperationKind.None) (Syntax: 'd.F')
F
Fredric Silberberg 已提交
25
  Children(1):
26
      IDynamicMemberReferenceExpression (Member Name: "F", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.F')
27
        Type Arguments(0)
F
Fredric Silberberg 已提交
28 29 30 31 32 33 34 35
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
36
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
37 38 39 40 41 42 43
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_GenericPropertyAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
44
        d.F(Of String)'BIND:"d.F(Of String)"
F
Fredric Silberberg 已提交
45 46 47 48 49
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
50
IOperation:  (OperationKind.None) (Syntax: 'd.F(Of String)')
F
Fredric Silberberg 已提交
51
  Children(1):
52
      IDynamicMemberReferenceExpression (Member Name: "F", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.F(Of String)')
53 54
        Type Arguments(1):
          Symbol: System.String
F
Fredric Silberberg 已提交
55 56 57 58 59 60 61 62
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
63
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
64 65 66 67 68 69 70
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_InvalidGenericPropertyAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
71
        d.F(Of)'BIND:"d.F(Of)"
F
Fredric Silberberg 已提交
72 73 74 75 76
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
77
IOperation:  (OperationKind.None, IsInvalid) (Syntax: 'd.F(Of)')
F
Fredric Silberberg 已提交
78
  Children(1):
79
      IDynamicMemberReferenceExpression (Member Name: "F", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object, IsInvalid) (Syntax: 'd.F(Of)')
80 81
        Type Arguments(1):
          Symbol: ?
F
Fredric Silberberg 已提交
82 83 84 85 86
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = <![CDATA[
BC30182: Type expected.
87 88
        d.F(Of)'BIND:"d.F(Of)"
              ~
F
Fredric Silberberg 已提交
89 90 91 92 93
]]>.Value

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
94
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
95 96 97 98 99 100 101
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_SimpleMethodCall()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
102
        d.F()'BIND:"d.F()"
F
Fredric Silberberg 已提交
103 104 105 106 107
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
108
IOperation:  (OperationKind.None) (Syntax: 'd.F()')
F
Fredric Silberberg 已提交
109
  Children(1):
110
      IDynamicMemberReferenceExpression (Member Name: "F", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.F')
111
        Type Arguments(0)
F
Fredric Silberberg 已提交
112 113 114 115 116 117 118 119
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
120
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
121 122 123 124 125 126 127
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_InvalidMethodCall_MissingParen()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
128
        d.F('BIND:"d.F("
F
Fredric Silberberg 已提交
129 130 131 132 133
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
134
IOperation:  (OperationKind.None, IsInvalid) (Syntax: 'd.F(')
F
Fredric Silberberg 已提交
135
  Children(2):
136
      IDynamicMemberReferenceExpression (Member Name: "F", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.F')
137
        Type Arguments(0)
F
Fredric Silberberg 已提交
138
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
139 140
      IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Object, IsInvalid) (Syntax: '')
        Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
F
Fredric Silberberg 已提交
141 142
        Operand: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
            Children(0)
F
Fredric Silberberg 已提交
143 144 145 146
]]>.Value

            Dim expectedDiagnostics = <![CDATA[
BC30198: ')' expected.
147 148
        d.F('BIND:"d.F("
            ~
F
Fredric Silberberg 已提交
149
BC30201: Expression expected.
150 151
        d.F('BIND:"d.F("
            ~
F
Fredric Silberberg 已提交
152 153 154 155 156
]]>.Value

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
157
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_GenericMethodCall_SingleGeneric()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.GetValue(Of String)()'BIND:"d.GetValue(Of String)()"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'd.GetValue(Of String)()')
  Children(1):
173 174 175
      IDynamicMemberReferenceExpression (Member Name: "GetValue", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.GetValue(Of String)')
        Type Arguments(1):
          Symbol: System.String
F
Fredric Silberberg 已提交
176 177 178 179 180 181 182 183
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
184
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_GenericMethodCall_MultipleGeneric()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.GetValue(Of String, Integer)()'BIND:"d.GetValue(Of String, Integer)()"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'd.GetValue( ...  Integer)()')
  Children(1):
200 201 202 203
      IDynamicMemberReferenceExpression (Member Name: "GetValue", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.GetValue( ... g, Integer)')
        Type Arguments(2):
          Symbol: System.String
          Symbol: System.Int32
F
Fredric Silberberg 已提交
204 205 206 207 208 209 210 211
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
212
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_GenericMethodCall_InvalidGenericParameter()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.GetValue(Of String,)()'BIND:"d.GetValue(Of String,)()"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None, IsInvalid) (Syntax: 'd.GetValue(Of String,)()')
  Children(1):
228 229 230 231
      IDynamicMemberReferenceExpression (Member Name: "GetValue", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object, IsInvalid) (Syntax: 'd.GetValue(Of String,)')
        Type Arguments(2):
          Symbol: System.String
          Symbol: ?
F
Fredric Silberberg 已提交
232 233 234 235 236 237 238 239 240 241 242 243
        Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = <![CDATA[
BC30182: Type expected.
        d.GetValue(Of String,)()'BIND:"d.GetValue(Of String,)()"
                             ~
]]>.Value

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
244
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_NestedPropertyAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.Prop1.Prop2'BIND:"d.Prop1.Prop2"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'd.Prop1.Prop2')
  Children(1):
260 261 262 263
      IDynamicMemberReferenceExpression (Member Name: "Prop2", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Prop1.Prop2')
        Type Arguments(0)
        Instance Receiver: IDynamicMemberReferenceExpression (Member Name: "Prop1", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Prop1')
            Type Arguments(0)
F
Fredric Silberberg 已提交
264 265 266 267 268 269 270 271
            Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
272
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_NestedMethodAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.Method1().Method2()'BIND:"d.Method1().Method2()"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'd.Method1().Method2()')
  Children(1):
288 289
      IDynamicMemberReferenceExpression (Member Name: "Method2", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Method1().Method2')
        Type Arguments(0)
F
Fredric Silberberg 已提交
290 291
        Instance Receiver: IOperation:  (OperationKind.None) (Syntax: 'd.Method1()')
            Children(1):
292 293
                IDynamicMemberReferenceExpression (Member Name: "Method1", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Method1')
                  Type Arguments(0)
F
Fredric Silberberg 已提交
294 295 296 297 298 299 300 301
                  Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
302
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_NestedPropertyAndMethodAccess()
            Dim source = <![CDATA[
Option Strict Off
Module Program
    Sub Main(args As String())
        Dim d = Nothing
        d.Prop1.Method2()'BIND:"d.Prop1.Method2()"
    End Sub
End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'd.Prop1.Method2()')
  Children(1):
318 319 320 321
      IDynamicMemberReferenceExpression (Member Name: "Method2", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Prop1.Method2')
        Type Arguments(0)
        Instance Receiver: IDynamicMemberReferenceExpression (Member Name: "Prop1", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'd.Prop1')
            Type Arguments(0)
F
Fredric Silberberg 已提交
322 323 324 325 326 327 328 329
            Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'd')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
330
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_LateBoundModuleFunction()
            Dim source = <![CDATA[
Option Strict Off
Imports System.Collections.Generic

Module Module1
    Sub Main()
        Dim x As Object = New List(Of Integer)()
        fun(x)'BIND:"fun(x)"
    End Sub

    Sub fun(Of X)(ByVal a As List(Of X))
    End Sub

End Module
]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'fun(x)')
  Children(2):
352 353
      IDynamicMemberReferenceExpression (Member Name: "fun", Containing Type: Module1) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'fun')
        Type Arguments(0)
F
Fredric Silberberg 已提交
354 355 356 357 358 359 360 361 362
        Instance Receiver: null
      ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'x')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

J
Jinu 已提交
363
        <CompilerTrait(CompilerFeature.IOperation)>
F
Fredric Silberberg 已提交
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
        <Fact()>
        Public Sub IDynamicMemberReferenceExpression_LateBoundClassFunction()
            Dim source = <![CDATA[
Option Strict Off
Imports System.Collections.Generic

Module Module1
    Sub Main()
        Dim x As Object = New List(Of Integer)()
        Dim c1 As New C1
        c1.fun(x)'BIND:"c1.fun(x)"
    End Sub

    Class C1
        Sub fun(Of X)(ByVal a As List(Of X))
        End Sub
    End Class
End Module]]>.Value

            Dim expectedOperationTree = <![CDATA[
IOperation:  (OperationKind.None) (Syntax: 'c1.fun(x)')
  Children(2):
386 387
      IDynamicMemberReferenceExpression (Member Name: "fun", Containing Type: null) (OperationKind.DynamicMemberReferenceExpression, Type: System.Object) (Syntax: 'c1.fun')
        Type Arguments(0)
F
Fredric Silberberg 已提交
388 389 390 391 392 393 394 395 396 397 398 399
        Instance Receiver: ILocalReferenceExpression: c1 (OperationKind.LocalReferenceExpression, Type: Module1.C1) (Syntax: 'c1')
      ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'x')
]]>.Value

            Dim expectedDiagnostics = String.Empty

            VerifyOperationTreeAndDiagnosticsForTest(Of InvocationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics)
        End Sub

    End Class
End Namespace