/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Binding/BindingCollectionInitializerTests.vb
2 101 строка
95 KB
Julien Couvreur
Enable GetTypeInfo for type of object creation syntax (#81802)
30 дек 2025, 23:12
Не верифицирован
30 дек 2025, 23:12
ab54c0a
Код
Авторство
О чём код?
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class BindingCollectionInitializerTests Inherits BasicTestBase <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerList() Dim source = <compilation name="CollectionInitializerList"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim c As New List(Of String) From {"Hello World!"} 'BIND:"New List(Of String) From {"Hello World!"}" Console.WriteLine(c(0)) End Sub End Class </file> </compilation> CompileAndVerify(source, "Hello World!") Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.List(Of System.String)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'New List(Of ... lo World!"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'From {"Hello World!"}') Initializers(1): IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Hello World!"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... lo World!"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello World!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!") (Syntax: '"Hello World!"') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerListEachElementAsCollectionInitializer() Dim source = <compilation name="CollectionInitializerListEachElementAsCollectionInitializer"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim c As New List(Of String) From {{"Hello"}, {" "}, {"World!"}}'BIND:"New List(Of String) From {{"Hello"}, {" "}, {"World!"}}" For each element in c Console.Write(element) next element End Sub End Class </file> </compilation> CompileAndVerify(source, "Hello World!") Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.List(Of System.String)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'New List(Of ... {"World!"}}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'From {{"Hel ... {"World!"}}') Initializers(3): IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{"Hello"}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... {"World!"}}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello") (Syntax: '"Hello"') 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) IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{" "}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... {"World!"}}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '" "') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: " ") (Syntax: '" "') 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) IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{"World!"}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... {"World!"}}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"World!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "World!") (Syntax: '"World!"') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerDictionary() Dim source = <compilation name="CollectionInitializerDictionary"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim c As New Dictionary(Of String, Integer) From {{"Hello", 23}, {"World", 42}}'BIND:"New Dictionary(Of String, Integer) From {{"Hello", 23}, {"World", 42}}" For Each keyValue In c Console.WriteLine(keyValue.Key + " " + keyValue.Value.ToString) Next End Sub End Class </file> </compilation> CompileAndVerify(source, expectedOutput:=<![CDATA[ Hello 23 World 42 ]]>) Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.Dictionary(Of System.String, System.Int32)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32)) (Syntax: 'New Diction ... orld", 42}}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32)) (Syntax: 'From {{"Hel ... orld", 42}}') Initializers(2): IInvocationOperation ( Sub System.Collections.Generic.Dictionary(Of System.String, System.Int32).Add(key As System.String, value As System.Int32)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{"Hello", 23}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32), IsImplicit) (Syntax: 'New Diction ... orld", 42}}') Arguments(2): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: key) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello") (Syntax: '"Hello"') 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) IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '23') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 23) (Syntax: '23') 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) IInvocationOperation ( Sub System.Collections.Generic.Dictionary(Of System.String, System.Int32).Add(key As System.String, value As System.Int32)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{"World", 42}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32), IsImplicit) (Syntax: 'New Diction ... orld", 42}}') Arguments(2): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: key) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"World"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "World") (Syntax: '"World"') 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) IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '42') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 42) (Syntax: '42') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerCustomCollection() Dim source = <compilation name="CollectionInitializerCustomCollection"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class Custom Private list As New List(Of String)() Public Function GetEnumerator() As CustomEnumerator Return New CustomEnumerator(list) End Function Public Sub add(p As String) list.Add(p) End Sub Public Class CustomEnumerator Private list As list(Of String) Private index As Integer = -1 Public Sub New(list As List(Of String)) Me.list = list End Sub Public Function MoveNext() As Boolean If Me.index < Me.list.Count - 1 Then index = index + 1 Return True End If Return False End function Public ReadOnly Property Current As String Get Return Me.list(index) End Get End Property End Class End Class Class C1 Public Shared Sub Main() Dim c as Custom = New Custom() From {"Hello", " ", "World"}'BIND:"New Custom() From {"Hello", " ", "World"}" Output(c) End Sub Public Shared Sub Output(c as custom) For Each value In c Console.Write(value) Next End Sub End Class </file> </compilation> CompileAndVerify(source, expectedOutput:=<![CDATA[ Hello World ]]>).VerifyIL("C1.Main", <![CDATA[ { // Code size 44 (0x2c) .maxstack 3 IL_0000: newobj "Sub Custom..ctor()" IL_0005: dup IL_0006: ldstr "Hello" IL_000b: callvirt "Sub Custom.add(String)" IL_0010: dup IL_0011: ldstr " " IL_0016: callvirt "Sub Custom.add(String)" IL_001b: dup IL_001c: ldstr "World" IL_0021: callvirt "Sub Custom.add(String)" IL_0026: call "Sub C1.Output(Custom)" IL_002b: ret } ]]>.Value) Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub Custom..ctor()) (OperationKind.ObjectCreation, Type: Custom) (Syntax: 'New Custom( ... ", "World"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: Custom) (Syntax: 'From {"Hell ... ", "World"}') Initializers(3): IInvocationOperation ( Sub Custom.add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Hello"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: Custom, IsImplicit) (Syntax: 'New Custom( ... ", "World"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello") (Syntax: '"Hello"') 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) IInvocationOperation ( Sub Custom.add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '" "') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: Custom, IsImplicit) (Syntax: 'New Custom( ... ", "World"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '" "') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: " ") (Syntax: '" "') 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) IInvocationOperation ( Sub Custom.add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"World"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: Custom, IsImplicit) (Syntax: 'New Custom( ... ", "World"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"World"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "World") (Syntax: '"World"') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerEmptyInitializers() Dim source = <![CDATA[ Option Strict On Imports System.Collections.Generic Class C2 End Class Class C1 Public Shared Sub Main() ' ok Dim a As New List(Of Integer) From {} ' not ok Dim b As New List(Of Integer) From {{}}'BIND:"New List(Of Integer) From {{}}" End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.List(Of System.Int32)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.List(Of System.Int32), IsInvalid) (Syntax: 'New List(Of ... ) From {{}}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.List(Of System.Int32), IsInvalid) (Syntax: 'From {{}}') Initializers(1): IInvalidOperation (OperationKind.Invalid, Type: ?, IsInvalid, IsImplicit) (Syntax: '{}') Children(0) ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC36721: An aggregate collection initializer entry must contain at least one element. Dim b As New List(Of Integer) From {{}}'BIND:"New List(Of Integer) From {{}}" ~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerNotACollection() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim c As New C1() From {"Hello World!"}'BIND:"New C1() From {"Hello World!"}" End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub C1..ctor()) (OperationKind.ObjectCreation, Type: C1, IsInvalid) (Syntax: 'New C1() Fr ... lo World!"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C1, IsInvalid) (Syntax: 'From {"Hello World!"}') Initializers(1): IInvalidOperation (OperationKind.Invalid, Type: ?, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') Children(1): ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!", IsInvalid) (Syntax: '"Hello World!"') ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC36718: Cannot initialize the type 'C1' with a collection initializer because it is not a collection type. Dim c As New C1() From {"Hello World!"}'BIND:"New C1() From {"Hello World!"}" ~~~~~~~~~~~~~~~~~~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerCannotCombineBothInitializers() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections Class C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function Public a As String Public Sub Add(p As String) End Sub End Class Class C1 Public a As String Public Shared Sub Main()'BIND:"Public Shared Sub Main()" Dim a As New C2() With {.a = "goo"} From {"Hello World!"} Dim b As New C2() From {"Hello World!"} With {.a = "goo"} Dim c As C2 = New C2() From {"Hello World!"} With {.a = "goo"} Dim d As C2 = New C2() With {.a = "goo"} From {"Hello World!"} End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IBlockOperation (6 statements, 4 locals) (OperationKind.Block, Type: null, IsInvalid) (Syntax: 'Public Shar ... End Sub') Locals: Local_1: a As C2 Local_2: b As C2 Local_3: c As C2 Local_4: d As C2 IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Dim a As Ne ... .a = "goo"}') IVariableDeclarationOperation (1 declarators) (OperationKind.VariableDeclaration, Type: null) (Syntax: 'a As New C2 ... .a = "goo"}') Declarators: IVariableDeclaratorOperation (Symbol: a As C2) (OperationKind.VariableDeclarator, Type: null) (Syntax: 'a') Initializer: null Initializer: IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: 'As New C2() ... .a = "goo"}') IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2) (Syntax: 'New C2() Wi ... .a = "goo"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2) (Syntax: 'With {.a = "goo"}') Initializers(1): ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: System.String) (Syntax: '.a = "goo"') Left: IFieldReferenceOperation: C2.a As System.String (OperationKind.FieldReference, Type: System.String) (Syntax: 'a') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsImplicit) (Syntax: 'New C2() Wi ... .a = "goo"}') Right: ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "goo") (Syntax: '"goo"') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Dim b As Ne ... lo World!"}') IVariableDeclarationOperation (1 declarators) (OperationKind.VariableDeclaration, Type: null) (Syntax: 'b As New C2 ... lo World!"}') Declarators: IVariableDeclaratorOperation (Symbol: b As C2) (OperationKind.VariableDeclarator, Type: null) (Syntax: 'b') Initializer: null Initializer: IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: 'As New C2() ... lo World!"}') IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2) (Syntax: 'New C2() Fr ... lo World!"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2) (Syntax: 'From {"Hello World!"}') Initializers(1): IInvocationOperation ( Sub C2.Add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Hello World!"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsImplicit) (Syntax: 'New C2() Fr ... lo World!"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello World!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!") (Syntax: '"Hello World!"') 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) IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Dim c As C2 ... lo World!"}') IVariableDeclarationOperation (1 declarators) (OperationKind.VariableDeclaration, Type: null, IsInvalid) (Syntax: 'c As C2 = N ... lo World!"}') Declarators: IVariableDeclaratorOperation (Symbol: c As C2) (OperationKind.VariableDeclarator, Type: null) (Syntax: 'c') Initializer: null Initializer: IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= New C2() ... lo World!"}') IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2, IsInvalid) (Syntax: 'New C2() Fr ... lo World!"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2, IsInvalid) (Syntax: 'From {"Hello World!"}') Initializers(1): IInvocationOperation ( Sub C2.Add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsInvalid, IsImplicit) (Syntax: 'New C2() Fr ... lo World!"}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!", IsInvalid) (Syntax: '"Hello World!"') 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) IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Dim d As C2 ... .a = "goo"}') IVariableDeclarationOperation (1 declarators) (OperationKind.VariableDeclaration, Type: null, IsInvalid) (Syntax: 'd As C2 = N ... .a = "goo"}') Declarators: IVariableDeclaratorOperation (Symbol: d As C2) (OperationKind.VariableDeclarator, Type: null) (Syntax: 'd') Initializer: null Initializer: IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= New C2() ... .a = "goo"}') IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2, IsInvalid) (Syntax: 'New C2() Wi ... .a = "goo"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2, IsInvalid) (Syntax: 'With {.a = "goo"}') Initializers(1): ISimpleAssignmentOperation (OperationKind.SimpleAssignment, Type: System.String, IsInvalid) (Syntax: '.a = "goo"') Left: IFieldReferenceOperation: C2.a As System.String (OperationKind.FieldReference, Type: System.String, IsInvalid) (Syntax: 'a') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsInvalid, IsImplicit) (Syntax: 'New C2() Wi ... .a = "goo"}') Right: ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "goo", IsInvalid) (Syntax: '"goo"') ILabeledOperation (Label: exit) (OperationKind.Labeled, Type: null, IsImplicit) (Syntax: 'End Sub') Statement: null IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'End Sub') ReturnedValue: null ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC36720: An Object Initializer and a Collection Initializer cannot be combined in the same initialization. Dim a As New C2() With {.a = "goo"} From {"Hello World!"} ~~~~ BC36720: An Object Initializer and a Collection Initializer cannot be combined in the same initialization. Dim b As New C2() From {"Hello World!"} With {.a = "goo"} ~~~~ BC36720: An Object Initializer and a Collection Initializer cannot be combined in the same initialization. Dim c As C2 = New C2() From {"Hello World!"} With {.a = "goo"} ~~~~~~~~~~~~~~~~~~~~~ BC36720: An Object Initializer and a Collection Initializer cannot be combined in the same initialization. Dim d As C2 = New C2() With {.a = "goo"} From {"Hello World!"} ~~~~~~~~~~~~~~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of MethodBlockSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerNoAddMethod() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections Class C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function End Class Class C3 Inherits C2 Protected Sub Add() End Sub End Class Class C4 Inherits C2 Public Property Add() As String End Class Class C5 Inherits C2 Public Add As String End Class Class C1 Public a As String Public Shared Sub Main() Dim a As New C2() From {"Hello World!"}'BIND:"New C2() From {"Hello World!"}" Dim b As New C3() From {"Hello World!"} Dim c As New C4() From {"Hello World!"} Dim d As New C5() From {"Hello World!"} End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2, IsInvalid) (Syntax: 'New C2() Fr ... lo World!"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2, IsInvalid) (Syntax: 'From {"Hello World!"}') Initializers(1): IInvalidOperation (OperationKind.Invalid, Type: ?, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') Children(1): ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!", IsInvalid) (Syntax: '"Hello World!"') ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC36719: Cannot initialize the type 'C2' with a collection initializer because it does not have an accessible 'Add' method. Dim a As New C2() From {"Hello World!"}'BIND:"New C2() From {"Hello World!"}" ~~~~~~~~~~~~~~~~~~~~~ BC36719: Cannot initialize the type 'C3' with a collection initializer because it does not have an accessible 'Add' method. Dim b As New C3() From {"Hello World!"} ~~~~~~~~~~~~~~~~~~~~~ BC36719: Cannot initialize the type 'C4' with a collection initializer because it does not have an accessible 'Add' method. Dim c As New C4() From {"Hello World!"} ~~~~~~~~~~~~~~~~~~~~~ BC36719: Cannot initialize the type 'C5' with a collection initializer because it does not have an accessible 'Add' method. Dim d As New C5() From {"Hello World!"} ~~~~~~~~~~~~~~~~~~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerAddMethodIsFunction() Dim source = <compilation name="CollectionInitializerAddMethodIsFunction"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections Public Class C1 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function Public Function Add(p As Integer) As String Console.WriteLine("What's the point of returning something here?") return "Boo!" End Function End Class Class C2 Public Shared Sub Main() Dim x As New C1() From {1}'BIND:"New C1() From {1}" End Sub End Class </file> </compilation> CompileAndVerify(source, expectedOutput:=<![CDATA[ What's the point of returning something here? ]]>) Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub C1..ctor()) (OperationKind.ObjectCreation, Type: C1) (Syntax: 'New C1() From {1}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C1) (Syntax: 'From {1}') Initializers(1): IInvocationOperation ( Function C1.Add(p As System.Int32) As System.String) (OperationKind.Invocation, Type: System.String, IsImplicit) (Syntax: '1') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C1, IsImplicit) (Syntax: 'New C1() From {1}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '1') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerOverloadResolutionErrors() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections Class C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function Public Sub Add() End Sub Protected Sub Add(p As String) End Sub End Class Class C3 Inherits C2 ' first argument matches Public Overloads Sub Add(p As String, q As Integer) End Sub End Class Class C4 Inherits C2 ' first argument does not match -> multiple candidates Public Overloads Sub Add(p As Integer, q As String) End Sub End Class Class C5 Inherits C2 ' first argument does not match -> multiple candidates Public Overloads Sub Add(p As Byte) End Sub End Class Class C1 Public a As String Public Shared Sub Main() Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"From {"Hello World!", "Errors will be shown for each initializer element"}" Dim b As New C3() From {"Hello World!"} Dim c As New C4() From {"Hello World!"} Dim d As New C5() From {300%} End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2, IsInvalid) (Syntax: 'From {"Hell ... r element"}') Initializers(2): IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '"Hello World!"') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsInvalid, IsImplicit) (Syntax: 'New C2() Fr ... r element"}') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!", IsInvalid) (Syntax: '"Hello World!"') IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '"Errors wil ... er element"') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '"Errors wil ... er element"') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: C2, IsInvalid, IsImplicit) (Syntax: 'New C2() Fr ... r element"}') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Errors will be shown for each initializer element", IsInvalid) (Syntax: '"Errors wil ... er element"') ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC30057: Too many arguments to 'Public Sub Add()'. Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"From {"Hello World!", "Errors will be shown for each initializer element"}" ~~~~~~~~~~~~~~ BC30057: Too many arguments to 'Public Sub Add()'. Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"From {"Hello World!", "Errors will be shown for each initializer element"}" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC30516: Overload resolution failed because no accessible 'Add' accepts this number of arguments. Dim b As New C3() From {"Hello World!"} ~~~~~~~~~~~~~~ BC30516: Overload resolution failed because no accessible 'Add' accepts this number of arguments. Dim c As New C4() From {"Hello World!"} ~~~~~~~~~~~~~~ BC30439: Constant expression not representable in type 'Byte'. Dim d As New C5() From {300%} ~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCollectionInitializerSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerWarningsWillBeKept() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections Class C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function Public Shared Sub Add(p As String) End Sub End Class Class C1 Public a As String Public Shared Sub Main() Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"New C2() From {"Hello World!", "Errors will be shown for each initializer element"}" End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub C2..ctor()) (OperationKind.ObjectCreation, Type: C2) (Syntax: 'New C2() Fr ... r element"}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: C2) (Syntax: 'From {"Hell ... r element"}') Initializers(2): IInvocationOperation (Sub C2.Add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Hello World!"') Instance Receiver: null Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello World!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello World!") (Syntax: '"Hello World!"') 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) IInvocationOperation (Sub C2.Add(p As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Errors wil ... er element"') Instance Receiver: null Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Errors wil ... er element"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Errors will be shown for each initializer element") (Syntax: '"Errors wil ... er element"') 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) ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"New C2() From {"Hello World!", "Errors will be shown for each initializer element"}" ~~~~~~~~~~~~~~ BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"}'BIND:"New C2() From {"Hello World!", "Errors will be shown for each initializer element"}" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <Fact()> Public Sub CollectionInitializerExtensionMethodsAreSupported() Dim source = <compilation name="CollectionInitializerExtensionMethodsAreSupported"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections Imports System.Collections.Generic Imports System.Runtime.CompilerServices Class C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function End Class Class C1 public a as string Public Shared Sub Main() ' extensions for custom type Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"} ' extensions for predefined type Dim x0 As LinkedList(Of Integer) = New LinkedList(Of Integer) From {1, 2, 3} End Sub End Class Module C2Extensions <Extension()> Public Sub Add(this as C2, p as string) End Sub <Extension()> Public Sub ADD(ByRef x As LinkedList(Of Integer), ByVal y As Integer) x.AddLast(y) End Sub End Module Namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Assembly Or AttributeTargets.Class Or AttributeTargets.Method)> Class ExtensionAttribute Inherits Attribute End Class End Namespace </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) AssertTheseDiagnostics(compilation, <expected> </expected>) End Sub <Fact()> Public Sub CollectionInitializerExtensionMethodsAreSupportedForValueTypes() Dim source = <compilation name="CollectionInitializerExtensionMethodsAreSupportedForValueTypes"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections Imports System.Collections.Generic Imports System.Runtime.CompilerServices Structure C2 Implements ICollection Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return Nothing End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function End Structure Class C1 public a as string Public Shared Sub Main() Dim a As New C2() From {"Hello World!", "Errors will be shown for each initializer element"} End Sub End Class Module C2Extensions <Extension()> Public Sub Add(this as C2, p as string) End Sub End Module Namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Assembly Or AttributeTargets.Class Or AttributeTargets.Method)> Class ExtensionAttribute Inherits Attribute End Class End Namespace </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) AssertTheseDiagnostics(compilation, <expected> </expected>) End Sub <Fact()> Public Sub CollectionInitializerTypeConstraintsAreSupported() Dim source = <compilation name="CollectionInitializerTypeConstraintsAreSupported"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections Imports System.Collections.Generic Public Interface IAdd(Of T) Sub Add(p As T) End Interface Public Class C2 Public Sub Add() End Sub End Class Class C3 Implements IAdd(Of String), ICollection private mylist as new list(of String)() Public Sub New() End Sub Public Sub Add1(p As String) Implements IAdd(Of String).Add mylist.add(p) End Sub Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo End Sub Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return 0 End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return False End Get End Property Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return mylist.getenumerator End Function End Class Class C1 Public Shared Sub DoStuff(Of T As {IAdd(Of String), ICollection, New})() Dim a As New T() From {"Hello", " ", "World!"} for each str as string in a Console.Write(str) next str End Sub Public Shared Sub Main() DoStuff(Of C3)() End Sub End Class </file> </compilation> CompileAndVerify(source, "Hello World!") End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerTypeConstraintsAndAmbiguity() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections Imports System.Collections.Generic Public Interface IAdd(Of T) Sub Add(p As String) End Interface Class C1 Public Shared Sub DoStuff(Of T As {IAdd(Of String), IAdd(Of Integer), ICollection, New})() Dim a As New T() From {"Hello", " ", "World!"}'BIND:"New T() From {"Hello", " ", "World!"}" For Each str As String In a Console.Write(str) Next str End Sub Public Shared Sub Main() End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ ITypeParameterObjectCreationOperation (OperationKind.TypeParameterObjectCreation, Type: T, IsInvalid) (Syntax: 'New T() Fro ... , "World!"}') Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: T, IsInvalid) (Syntax: 'From {"Hell ... , "World!"}') Initializers(3): IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '"Hello"') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '"Hello"') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: T, IsInvalid, IsImplicit) (Syntax: 'New T() Fro ... , "World!"}') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello", IsInvalid) (Syntax: '"Hello"') IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '" "') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '" "') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: T, IsInvalid, IsImplicit) (Syntax: 'New T() Fro ... , "World!"}') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: " ", IsInvalid) (Syntax: '" "') IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '"World!"') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '"World!"') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: T, IsInvalid, IsImplicit) (Syntax: 'New T() Fro ... , "World!"}') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "World!", IsInvalid) (Syntax: '"World!"') ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC30521: Overload resolution failed because no accessible 'Add' is most specific for these arguments: 'Sub IAdd(Of String).Add(p As String)': Not most specific. 'Sub IAdd(Of Integer).Add(p As String)': Not most specific. Dim a As New T() From {"Hello", " ", "World!"}'BIND:"New T() From {"Hello", " ", "World!"}" ~~~~~~~ BC30521: Overload resolution failed because no accessible 'Add' is most specific for these arguments: 'Sub IAdd(Of String).Add(p As String)': Not most specific. 'Sub IAdd(Of Integer).Add(p As String)': Not most specific. Dim a As New T() From {"Hello", " ", "World!"}'BIND:"New T() From {"Hello", " ", "World!"}" ~~~ BC30521: Overload resolution failed because no accessible 'Add' is most specific for these arguments: 'Sub IAdd(Of String).Add(p As String)': Not most specific. 'Sub IAdd(Of Integer).Add(p As String)': Not most specific. Dim a As New T() From {"Hello", " ", "World!"}'BIND:"New T() From {"Hello", " ", "World!"}" ~~~~~~~~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <WorkItem(529265, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529265")> <Fact()> Public Sub CollectionInitializerCollectionInitializerArityCheck() Dim source = <![CDATA[ Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim x As New Dictionary(Of String, Integer) From {{1}}'BIND:"New Dictionary(Of String, Integer) From {{1}}" End Sub End Class]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.Dictionary(Of System.String, System.Int32)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32), IsInvalid) (Syntax: 'New Diction ... From {{1}}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32), IsInvalid) (Syntax: 'From {{1}}') Initializers(1): IInvalidOperation (OperationKind.Invalid, Type: System.Void, IsInvalid, IsImplicit) (Syntax: '{1}') Children(2): IOperation: (OperationKind.None, Type: null, IsInvalid, IsImplicit) (Syntax: '{1}') Children(1): IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.Dictionary(Of System.String, System.Int32), IsInvalid, IsImplicit) (Syntax: 'New Diction ... From {{1}}') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1') ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC30455: Argument not specified for parameter 'value' of 'Public Overloads Sub Add(key As String, value As Integer)'. Dim x As New Dictionary(Of String, Integer) From {{1}}'BIND:"New Dictionary(Of String, Integer) From {{1}}" ~~~ BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'String'. Dim x As New Dictionary(Of String, Integer) From {{1}}'BIND:"New Dictionary(Of String, Integer) From {{1}}" ~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <Fact()> Public Sub CollectionInitializerReferencingItself() Dim source = <compilation name="CollectionInitializerReferencingItselfRefType"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Imports System.Collections Interface IMissingStuff Sub Add(p As String) Function Item() As String End Interface Structure Custom Implements IMissingStuff, IEnumerable(Of String) Public Shared list As New List(Of String)() Public Sub Add(p As String) Implements IMissingStuff.Add list.Add(p) End Sub Public Function Item() As String Implements IMissingStuff.Item Return Nothing End Function Public Structure CustomEnumerator Implements IEnumerator(Of String) Private list As List(Of String) Private Shared index As Integer = -1 Public Sub New(list As List(Of String)) Me.list = list End Sub Public Function MoveNext() As Boolean If index < Me.list.Count - 1 Then index = index + 1 Return True End If Return False End function Public ReadOnly Property Current As String Get Return Me.list(index) End Get End Property Public ReadOnly Property Current1 As String Implements IEnumerator(Of String).Current Get Return Current End Get End Property Public ReadOnly Property Current2 As Object Implements IEnumerator.Current Get Return Current End Get End Property Public Function MoveNext1() As Boolean Implements IEnumerator.MoveNext Return MoveNext() End Function Public Sub Reset() Implements IEnumerator.Reset End Sub Public Sub Dispose() Implements IDisposable.Dispose End Sub end structure Public Function GetEnumerator1() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator Return New CustomEnumerator(list) End Function Public Function GetEnumerator2() As IEnumerator Implements IEnumerable.GetEnumerator Return New CustomEnumerator(list) End Function End Structure Structure CustomNonEmpty Implements IMissingStuff, IEnumerable(Of String) Public MakeItNonEmpty as String Public Shared list As New List(Of String)() Public Sub Add(p As String) Implements IMissingStuff.Add list.Add(p) End Sub Public Function Item() As String Implements IMissingStuff.Item Return Nothing End Function Public Structure CustomEnumerator Implements IEnumerator(Of String) Private list As List(Of String) Private Shared index As Integer = -1 Public Sub New(list As List(Of String)) Me.list = list End Sub Public Function MoveNext() As Boolean If index < Me.list.Count - 1 Then index = index + 1 Return True End If Return False End function Public ReadOnly Property Current As String Get Return Me.list(index) End Get End Property Public ReadOnly Property Current1 As String Implements IEnumerator(Of String).Current Get Return Current End Get End Property Public ReadOnly Property Current2 As Object Implements IEnumerator.Current Get Return Current End Get End Property Public Function MoveNext1() As Boolean Implements IEnumerator.MoveNext Return MoveNext() End Function Public Sub Reset() Implements IEnumerator.Reset End Sub Public Sub Dispose() Implements IDisposable.Dispose End Sub end structure Public Function GetEnumerator1() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator Return New CustomEnumerator(list) End Function Public Function GetEnumerator2() As IEnumerator Implements IEnumerable.GetEnumerator Return New CustomEnumerator(list) End Function End Structure Class CBase(Of T) Public Overridable Sub TypeParameterValueTypeAsClassConstraint(Of U As {T, IEnumerable, IMissingStuff})() End Sub End Class Class CDerived Inherits CBase(Of Custom) Public Overrides Sub TypeParameterValueTypeAsClassConstraint(Of U As {Custom, IEnumerable, IMissingStuff})() Dim m As New U From {"Hello World!", m.Item(0)} ' temp used, m is uninitialized, show warning Dim n As U = New U() From {"Hello World!", n.Item(0)} ' temp used, h is uninitialized, show warning Dim o, p As New U() From {o.Item(0), p.Item(0)} ' temps used, show warnings (although o is initialized when initializing p) End Sub End Class Class C1 Public Sub TypeParameterNotDefined(Of T As {IEnumerable, IMissingStuff, New})() ' no warnings from type parameters as well Dim e As New T From {"Hello World!", e.Item(0)} ' Receiver type unknown, no warning Dim f As T = New T() From {"Hello World!", f.Item(0)} ' Receiver type unknown, no warning End Sub Public Sub TypeParameterAsStructure(Of T As {Structure, IEnumerable, IMissingStuff})() ' no warnings from type parameters as well Dim g As New T From {"Hello World!", g.Item(0)} ' temp used, g is uninitialized, show warning Dim h As T = New T() From {"Hello World!", h.Item(0)} ' temp used, h is uninitialized, show warning Dim i, j As New T() From {i.Item(0), j.Item(0)} ' temps used, show warnings (although i is initialized when initializing j) End Sub Public Sub TypeParameterAsRefType(Of T As {List(Of String), new})() Dim k As New T From {"Hello World!", k.Item(0)} ' temp used, k is uninitialized, show warning Dim l As T = New T() From {"Hello World!", l.Item(0)} ' temp used, l is uninitialized, show warning End Sub Public Shared Sub Main() Dim a As New Custom From {"Hello World!", a.Item(0)} ' empty, non trackable structure, no warning Dim b As Custom = New Custom() From {"Hello World!", b.Item(0)} ' empty, non trackable structure, no warning Dim q As New CustomNonEmpty From {"Hello World!", q.Item(0)} ' temp used, q is uninitialized, show warning Dim r As CustomNonEmpty = New CustomNonEmpty() From {"Hello World!", r.Item(0)} ' temp used, r is uninitialized, show warning ' reference types are not ok, they are still Nothing Dim c As New List(Of String) From {"Hello World!", c.Item(0)} ' show warning Dim d As List(Of String) = New List(Of String)() From {"Hello World!", d.Item(0)} ' show warning ' was already assigned, no warning again. c = New List(Of String)() From {"Hello World!", c.Item(0)} ' no warning End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) AssertTheseDiagnostics(compilation, <expected> BC42109: Variable 'm' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim m As New U From {"Hello World!", m.Item(0)} ' temp used, m is uninitialized, show warning ~ BC42109: Variable 'n' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim n As U = New U() From {"Hello World!", n.Item(0)} ' temp used, h is uninitialized, show warning ~ BC42109: Variable 'o' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim o, p As New U() From {o.Item(0), p.Item(0)} ' temps used, show warnings (although o is initialized when initializing p) ~ BC42109: Variable 'p' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim o, p As New U() From {o.Item(0), p.Item(0)} ' temps used, show warnings (although o is initialized when initializing p) ~ BC42109: Variable 'g' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim g As New T From {"Hello World!", g.Item(0)} ' temp used, g is uninitialized, show warning ~ BC42109: Variable 'h' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim h As T = New T() From {"Hello World!", h.Item(0)} ' temp used, h is uninitialized, show warning ~ BC42109: Variable 'i' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim i, j As New T() From {i.Item(0), j.Item(0)} ' temps used, show warnings (although i is initialized when initializing j) ~ BC42109: Variable 'j' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim i, j As New T() From {i.Item(0), j.Item(0)} ' temps used, show warnings (although i is initialized when initializing j) ~ BC42104: Variable 'k' is used before it has been assigned a value. A null reference exception could result at runtime. Dim k As New T From {"Hello World!", k.Item(0)} ' temp used, k is uninitialized, show warning ~ BC42104: Variable 'l' is used before it has been assigned a value. A null reference exception could result at runtime. Dim l As T = New T() From {"Hello World!", l.Item(0)} ' temp used, l is uninitialized, show warning ~ BC42109: Variable 'q' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim q As New CustomNonEmpty From {"Hello World!", q.Item(0)} ' temp used, q is uninitialized, show warning ~ BC42109: Variable 'r' is used before it has been assigned a value. A null reference exception could result at runtime. Make sure the structure or all the reference members are initialized before use Dim r As CustomNonEmpty = New CustomNonEmpty() From {"Hello World!", r.Item(0)} ' temp used, r is uninitialized, show warning ~ BC42104: Variable 'c' is used before it has been assigned a value. A null reference exception could result at runtime. Dim c As New List(Of String) From {"Hello World!", c.Item(0)} ' show warning ~ BC42104: Variable 'd' is used before it has been assigned a value. A null reference exception could result at runtime. Dim d As List(Of String) = New List(Of String)() From {"Hello World!", d.Item(0)} ' show warning ~ </expected>) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerReferencingItself_2() Dim source = <![CDATA[ Imports System Imports System.Collections.Generic Module Program Sub Main(args As String()) Dim x, y As New List(Of String)() From {"1", x.Item(0)}'BIND:"New List(Of String)() From {"1", x.Item(0)}" Dim z As New List(Of String)() From {"1", z.Item(0)} End Sub End Module]]>.Value Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub System.Collections.Generic.List(Of System.String)..ctor()) (OperationKind.ObjectCreation, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'New List(Of ... x.Item(0)}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'From {"1", x.Item(0)}') Initializers(2): IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"1"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... x.Item(0)}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"1"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "1") (Syntax: '"1"') 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) IInvocationOperation ( Sub System.Collections.Generic.List(Of System.String).Add(item As System.String)) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: 'x.Item(0)') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: System.Collections.Generic.List(Of System.String), IsImplicit) (Syntax: 'New List(Of ... x.Item(0)}') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: item) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: 'x.Item(0)') IPropertyReferenceOperation: Property System.Collections.Generic.List(Of System.String).Item(index As System.Int32) As System.String (OperationKind.PropertyReference, Type: System.String) (Syntax: 'x.Item(0)') Instance Receiver: ILocalReferenceOperation: x (OperationKind.LocalReference, Type: System.Collections.Generic.List(Of System.String)) (Syntax: 'x') Arguments(1): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: index) (OperationKind.Argument, Type: null) (Syntax: '0') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0') 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) 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) ]]>.Value Dim expectedDiagnostics = <![CDATA[ BC42104: Variable 'x' is used before it has been assigned a value. A null reference exception could result at runtime. Dim x, y As New List(Of String)() From {"1", x.Item(0)}'BIND:"New List(Of String)() From {"1", x.Item(0)}" ~ BC42104: Variable 'z' is used before it has been assigned a value. A null reference exception could result at runtime. Dim z As New List(Of String)() From {"1", z.Item(0)} ~ ]]>.Value VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub <CompilerTrait(CompilerFeature.IOperation)> <Fact()> Public Sub CollectionInitializerCustomCollectionOptionalParameter() Dim source = <compilation name="CollectionInitializerCustomCollection"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class Custom Private list As New List(Of String)() Public Function GetEnumerator() As CustomEnumerator Return New CustomEnumerator(list) End Function Public Sub add(p As String, optional p2 as String = " ") list.Add(p) list.Add(p2) End Sub Public Class CustomEnumerator Private list As list(Of String) Private index As Integer = -1 Public Sub New(list As List(Of String)) Me.list = list End Sub Public Function MoveNext() As Boolean If Me.index < Me.list.Count - 1 Then index = index + 1 Return True End If Return False End function Public ReadOnly Property Current As String Get Return Me.list(index) End Get End Property End Class End Class Class C1 Public Shared Sub Main() Dim c as Custom = New Custom() From {"Hello", {"World", "!"}}'BIND:"New Custom() From {"Hello", {"World", "!"}}" Output(c) End Sub Public Shared Sub Output(c as custom) For Each value In c Console.Write(value) Next End Sub End Class </file> </compilation> CompileAndVerify(source, expectedOutput:=<![CDATA[ Hello World! ]]>) Dim expectedOperationTree = <![CDATA[ IObjectCreationOperation (Constructor: Sub Custom..ctor()) (OperationKind.ObjectCreation, Type: Custom) (Syntax: 'New Custom( ... rld", "!"}}') Arguments(0) Initializer: IObjectOrCollectionInitializerOperation (OperationKind.ObjectOrCollectionInitializer, Type: Custom) (Syntax: 'From {"Hell ... rld", "!"}}') Initializers(2): IInvocationOperation ( Sub Custom.add(p As System.String, [p2 As System.String = " "])) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '"Hello"') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: Custom, IsImplicit) (Syntax: 'New Custom( ... rld", "!"}}') Arguments(2): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "Hello") (Syntax: '"Hello"') 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) IArgumentOperation (ArgumentKind.DefaultValue, Matching Parameter: p2) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"Hello"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: " ", IsImplicit) (Syntax: '"Hello"') 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) IInvocationOperation ( Sub Custom.add(p As System.String, [p2 As System.String = " "])) (OperationKind.Invocation, Type: System.Void, IsImplicit) (Syntax: '{"World", "!"}') Instance Receiver: IInstanceReferenceOperation (ReferenceKind: ImplicitReceiver) (OperationKind.InstanceReference, Type: Custom, IsImplicit) (Syntax: 'New Custom( ... rld", "!"}}') Arguments(2): IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"World"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "World") (Syntax: '"World"') 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) IArgumentOperation (ArgumentKind.Explicit, Matching Parameter: p2) (OperationKind.Argument, Type: null, IsImplicit) (Syntax: '"!"') ILiteralOperation (OperationKind.Literal, Type: System.String, Constant: "!") (Syntax: '"!"') 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) ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of ObjectCreationExpressionSyntax)(source.Value, expectedOperationTree, expectedDiagnostics) End Sub <Fact()> Public Sub CollectionInitializerCustomCollectionParamArray() Dim source = <compilation name="CollectionInitializerCustomCollection"> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class Custom Private list As New List(Of String)() Public Function GetEnumerator() As CustomEnumerator Return New CustomEnumerator(list) End Function Public Sub add(paramarray p() As String) list.AddRange(p) End Sub Public Class CustomEnumerator Private list As list(Of String) Private index As Integer = -1 Public Sub New(list As List(Of String)) Me.list = list End Sub Public Function MoveNext() As Boolean If Me.index < Me.list.Count - 1 Then index = index + 1 Return True End If Return False End function Public ReadOnly Property Current As String Get Return Me.list(index) End Get End Property End Class End Class Class C1 Public Shared Sub Main() Dim c as Custom = New Custom() From {"Hello", {" ", "World"}, ({"!", "!", "!"})} Output(c) End Sub Public Shared Sub Output(c as custom) For Each value In c Console.Write(value) Next End Sub End Class </file> </compilation> CompileAndVerify(source, expectedOutput:=<![CDATA[ Hello World!!! ]]>) End Sub <Fact(), WorkItem(529787, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529787")> Public Sub GetCollectionInitializerSymbolInfo_01() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Collections.Generic class X Inherits List(Of Integer) Sub Add(x As Integer) End Sub Sub Add(x As String) End Sub Shared Sub Main() Dim z = new X() From { String.Empty, 'BIND1:"String.Empty" 12} 'BIND2:"12" End Sub End Class ]]></file> </compilation>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticInfo As SemanticInfoSummary = Nothing Dim semanticModel = compilation.GetSemanticModel(tree) Dim symbolInfo As SymbolInfo If True Then Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 1) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node1) Assert.NotNull(symbolInfo.Symbol) Assert.Equal("Sub X.Add(x As System.String)", symbolInfo.Symbol.ToTestDisplayString()) Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason) Assert.Equal(0, symbolInfo.CandidateSymbols.Length) End If If True Then Dim node2 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 2) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node2) Assert.NotNull(symbolInfo.Symbol) Assert.Equal("Sub X.Add(x As System.Int32)", symbolInfo.Symbol.ToTestDisplayString()) Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason) Assert.Equal(0, symbolInfo.CandidateSymbols.Length) End If End Sub <Fact(), WorkItem(529787, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529787")> Public Sub GetCollectionInitializerSymbolInfo_02() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Collections.Generic class X Inherits List(Of Integer) Sub Add(x As X) End Sub Sub Add(x As List(Of Byte)) End Sub Shared Sub Main() Dim z = new X() From { String.Empty } 'BIND1:"String.Empty" End Sub End Class ]]></file> </compilation>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticInfo As SemanticInfoSummary = Nothing Dim semanticModel = compilation.GetSemanticModel(tree) Dim symbolInfo As SymbolInfo Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 1) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node1) Assert.Null(symbolInfo.Symbol) Assert.Equal(CandidateReason.OverloadResolutionFailure, symbolInfo.CandidateReason) Assert.Equal(2, symbolInfo.CandidateSymbols.Length) AssertEx.Equal({"Sub X.Add(x As System.Collections.Generic.List(Of System.Byte))", "Sub X.Add(x As X)"}, (symbolInfo.CandidateSymbols.Select(Function(s) s.ToTestDisplayString()).Order()).ToArray()) End Sub <Fact(), WorkItem(529787, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529787")> Public Sub GetCollectionInitializerSymbolInfo_03() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Collections.Generic Class Base Implements IEnumerable(Of Integer) End Class class X Inherits Base Protected Sub Add(x As String) End Sub End Class class Y Shared Sub Main() Dim z = new X() From { String.Empty } 'BIND1:"String.Empty" End Sub End Class ]]></file> </compilation>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticInfo As SemanticInfoSummary = Nothing Dim semanticModel = compilation.GetSemanticModel(tree) Dim symbolInfo As SymbolInfo Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 1) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node1) Assert.Null(symbolInfo.Symbol) Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason) Assert.Equal(0, symbolInfo.CandidateSymbols.Length) End Sub <Fact(), WorkItem(529787, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529787")> Public Sub GetCollectionInitializerSymbolInfo_04() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Collections.Generic class X Inherits List(Of Integer) Sub Add(x As String, y As Integer) End Sub Shared Sub Main() Dim z = new X() From { {String.Empty, 12} } 'BIND1:"{String.Empty, 12}" End Sub End Class ]]></file> </compilation>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticInfo As SemanticInfoSummary = Nothing Dim semanticModel = compilation.GetSemanticModel(tree) Dim symbolInfo As SymbolInfo Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 1) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node1) Assert.NotNull(symbolInfo.Symbol) Assert.Equal("Sub X.Add(x As System.String, y As System.Int32)", symbolInfo.Symbol.ToTestDisplayString()) Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason) Assert.Equal(0, symbolInfo.CandidateSymbols.Length) End Sub <Fact(), WorkItem(529787, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529787")> Public Sub GetCollectionInitializerSymbolInfo_05() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Collections.Generic class X Inherits List(Of Integer) Sub Add(x As String, y As Integer) End Sub Shared Sub Main() Dim z = new X() From { {String.Empty, 'BIND1:"String.Empty" 12} } 'BIND2:"12" End Sub End Class ]]></file> </compilation>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticInfo As SemanticInfoSummary = Nothing Dim semanticModel = compilation.GetSemanticModel(tree) Dim symbolInfo As SymbolInfo For i As Integer = 1 To 2 Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", i) symbolInfo = semanticModel.GetCollectionInitializerSymbolInfo(node1) Assert.Null(symbolInfo.Symbol) Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason) Assert.Equal(0, symbolInfo.CandidateSymbols.Length) Next End Sub <Fact()> <WorkItem(12983, "https://github.com/dotnet/roslyn/issues/12983")> Public Sub GetCollectionInitializerSymbolInfo_06() Dim compilation = CreateCompilationWithMscorlib40( <compilation> <file name="a.vb"> Option Strict On Imports System Imports System.Collections.Generic Class C1 Public Shared Sub Main() Dim list1 = new List(Of String) Dim list2 = new List(Of String)() Dim list3 = new List(Of String) With { .Count = 3 } Dim list4 = new List(Of String)() With { .Count = 3 } Dim list5 = new List(Of String) From { 1, 2, 3 } Dim list6 = new List(Of String)() From { 1, 2, 3 } End Sub End Class </file> </compilation>) Dim tree = compilation.SyntaxTrees.Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim nodes = tree.GetRoot().DescendantNodes().OfType(Of GenericNameSyntax)().ToArray() Assert.Equal(6, nodes.Length) For Each name In nodes Assert.Equal("List(Of String)", name.ToString()) Assert.Equal("System.Collections.Generic.List(Of System.String)", semanticModel.GetSymbolInfo(name).Symbol.ToTestDisplayString()) Assert.Equal("System.Collections.Generic.List(Of System.String)", semanticModel.GetTypeInfo(name).Type.ToTestDisplayString()) Next End Sub <Fact()> <WorkItem(27034, "https://github.com/dotnet/roslyn/issues/27034")> Public Sub LateBoundCollectionInitializer() Dim source = <compilation> <file name="a.vb"> Imports System Imports System.Collections Imports System.Collections.Generic Module Mod1 Sub Main(args() As String) Dim c As New C() c.M(1) End Sub Class C Implements IEnumerable(Of Integer) Public Sub M(a As Object) Dim c = New C From {a} End Sub Public Function GetEnumerator() As IEnumerator(Of Integer) Implements IEnumerable(Of Integer).GetEnumerator Throw New NotImplementedException() End Function Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Throw New NotImplementedException() End Function Public Sub Add(i As Integer) Console.WriteLine("Called Integer Add") End Sub Public Sub Add(l As Long) Console.WriteLine("Called Long Add") End Sub End Class End Module </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="Called Integer Add") verifier.VerifyIL("Mod1.C.M", <![CDATA[ { // Code size 62 (0x3e) .maxstack 10 .locals init (Mod1.C V_0, Object() V_1, Boolean() V_2) IL_0000: newobj "Sub Mod1.C..ctor()" IL_0005: stloc.0 IL_0006: ldloc.0 IL_0007: ldnull IL_0008: ldstr "Add" IL_000d: ldc.i4.1 IL_000e: newarr "Object" IL_0013: dup IL_0014: ldc.i4.0 IL_0015: ldarg.1 IL_0016: stelem.ref IL_0017: dup IL_0018: stloc.1 IL_0019: ldnull IL_001a: ldnull IL_001b: ldc.i4.1 IL_001c: newarr "Boolean" IL_0021: dup IL_0022: ldc.i4.0 IL_0023: ldc.i4.1 IL_0024: stelem.i1 IL_0025: dup IL_0026: stloc.2 IL_0027: ldc.i4.1 IL_0028: call "Function Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object, System.Type, String, Object(), String(), System.Type(), Boolean(), Boolean) As Object" IL_002d: pop IL_002e: ldloc.2 IL_002f: ldc.i4.0 IL_0030: ldelem.u1 IL_0031: brfalse.s IL_003d IL_0033: ldloc.1 IL_0034: ldc.i4.0 IL_0035: ldelem.ref IL_0036: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_003b: starg.s V_1 IL_003d: ret } ]]>) End Sub End Class End Namespace