/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/NonTrailingNamedArgumentsTests.vb
1 165 строк
41 KB
Tomáš Matoušek
Remove Microsoft.CodeAnalysis.Test.Extensions namespace (#50051)
19 дек 2020, 01:41
Не верифицирован
19 дек 2020, 01:41
7aeb78f
Код
Авторство
О чём код?
' 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.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics <CompilerTrait(CompilerFeature.NonTrailingNamedArgs)> Public Class NonTrailingNamedArgumentsTests Inherits BasicTestBase Private Shared ReadOnly latestParseOptions As VisualBasicParseOptions = TestOptions.Regular.WithLanguageVersion(LanguageVersion.Latest) <Fact> Public Sub TestSimpleWithOldLangVer() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer) End Sub Shared Sub Main() M(a:=1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. M(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimple() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub Shared Sub M(b As Long, a As Long) System.Console.Write($"Second {b} {a}. ") End Sub Shared Sub Main() M(a:=1, 2) M(3, a:=4) End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2. Second 3 4.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim tree = verifier.Compilation.SyntaxTrees.First() Dim model = verifier.Compilation.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim firstInvocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(2) Assert.Equal("M(a:=1, 2)", firstInvocation.ToString()) Assert.Equal("Sub C.M(a As System.Int32, b As System.Int32)", model.GetSymbolInfo(firstInvocation).Symbol.ToTestDisplayString()) Dim firstNamedArgA = nodes.OfType(Of NameColonEqualsSyntax)().ElementAt(0) Assert.Equal("a:=1", firstNamedArgA.Parent.ToString()) Dim firstASymbol = model.GetSymbolInfo(firstNamedArgA.Name) Assert.Equal(SymbolKind.Parameter, firstASymbol.Symbol.Kind) Assert.Equal("a", firstASymbol.Symbol.Name) Assert.Equal("Sub C.M(a As System.Int32, b As System.Int32)", firstASymbol.Symbol.ContainingSymbol.ToTestDisplayString()) Dim secondInvocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(3) Assert.Equal("M(3, a:=4)", secondInvocation.ToString()) Assert.Equal("Sub C.M(b As System.Int64, a As System.Int64)", model.GetSymbolInfo(secondInvocation).Symbol.ToTestDisplayString()) Dim secondNamedArgA = nodes.OfType(Of NameColonEqualsSyntax)().ElementAt(1) Assert.Equal("a:=4", secondNamedArgA.Parent.ToString()) Dim secondASymbol = model.GetSymbolInfo(secondNamedArgA.Name) Assert.Equal(SymbolKind.Parameter, secondASymbol.Symbol.Kind) Assert.Equal("a", secondASymbol.Symbol.Name) Assert.Equal("Sub C.M(b As System.Int64, a As System.Int64)", secondASymbol.Symbol.ContainingSymbol.ToTestDisplayString()) End Sub <Fact> Public Sub TestSimpleConstructor() Dim source = <compilation> <file name="Program.vb"> Class C Sub New(a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub Shared Sub Main() Dim c = New C(a:=1, 2) End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. Dim c = New C(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimpleThis() Dim source = <compilation> <file name="Program.vb"> Class C Sub New(a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub Sub New() Me.New(a:=1, 2) End Sub Shared Sub Main() Dim c = New C() End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. Me.New(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimpleBase() Dim source = <compilation> <file name="Program.vb"> Class C Sub New(a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub End Class Class Derived Inherits C Sub New() MyBase.New(a:=1, 2) End Sub Shared Sub Main() Dim derived = New Derived() End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() End Sub <Fact> Public Sub TestSimpleExtension() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Module Extensions <System.Runtime.CompilerServices.Extension> Sub M(ByVal c As C, a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub End Module Class C Shared Sub Main() Dim c = New C() c.M(a:=1, 2) End Sub End Class ]]></file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. c.M(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimpleDelegate() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Class C Delegate Sub MyDelegate(a As Integer, b As Integer) Shared Sub M(a As Integer, b As Integer) System.Console.Write($"First {a} {b}. ") End Sub Shared Sub Main() Dim f As MyDelegate = AddressOf M f(a:=1, 2) End Sub End Class ]]></file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. f(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimpleIndexer() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Class C Default ReadOnly Property Item(a As Integer, b As Integer) As Integer Get System.Console.Write($"First {a} {b}. ") Return 0 End Get End Property Shared Sub Main() Dim c = New C() Dim x = c(a:=1, 2) End Sub End Class ]]></file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="First 1 2.", parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier.VerifyDiagnostics() Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. Dim x = c(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestSimpleError() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Class C Sub New(a As Integer, b As Integer) End Sub Default ReadOnly Property Item(a As Integer, b As Integer) As Integer Get Return 0 End Get End Property Shared Sub Main() Dim c = New C(b:=1, 2) Dim x = c(b:=1, 2) End Sub End Class ]]></file> </compilation> Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) comp.AssertTheseDiagnostics(<errors> BC37302: Named argument 'b' is used out-of-position but is followed by an unnamed argument Dim c = New C(b:=1, 2) ~ BC37302: Named argument 'b' is used out-of-position but is followed by an unnamed argument Dim x = c(b:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestMetadataAndPESymbols() Dim lib_vb = <compilation> <file name="Lib.vb"><![CDATA[ Public Class C Public Shared Sub M(a As Integer, b As Integer) System.Console.Write($"{a} {b}. ") End Sub End Class ]]></file> </compilation> Dim source = <compilation> <file name="Program.vb"><![CDATA[ Class D Shared Sub Main() C.M(a:=1, 2) End Sub End Class ]]></file> </compilation> Dim libComp = CreateCompilationWithMscorlib40AndVBRuntime(lib_vb, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15)) Dim verifier1 = CompileAndVerify(source, expectedOutput:="1 2.", references:={libComp.ToMetadataReference()}, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier1.VerifyDiagnostics() Dim verifier2 = CompileAndVerify(source, expectedOutput:="1 2.", references:={libComp.EmitToImageReference()}, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_5)) verifier2.VerifyDiagnostics() End Sub <Fact> Public Sub TestPositionalUnaffected() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(first As Integer, other As Integer) System.Console.Write($"{first} {other}") End Sub Shared Sub Main() M(1, first:=2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30455: Argument not specified for parameter 'other' of 'Public Shared Sub M(first As Integer, other As Integer)'. M(1, first:=2) ~ BC30274: Parameter 'first' of 'Public Shared Sub M(first As Integer, other As Integer)' already has a matching argument. M(1, first:=2) ~~~~~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(1, first:=2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestPositionalUnaffected2() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer, Optional c As Integer = 1) System.Console.Write($"M {a} {b}") End Sub Shared Sub Main() M(c:=1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC37302: Named argument 'c' is used out-of-position but is followed by an unnamed argument M(c:=1, 2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(c:=1, 2)", invocation.ToString()) AssertEx.Equal({"Sub C.M(a As System.Int32, b As System.Int32, [c As System.Int32 = 1])"}, model.GetSymbolInfo(invocation).CandidateSymbols.Select(Function(c) c.ToTestDisplayString())) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestPositionalUnaffected2WithOmitted() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer, Optional c As Integer = 1, Optional d As Integer = 2) System.Console.Write($"M {a} {b}") End Sub Shared Sub Main() M(c:=1, 2,) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC37302: Named argument 'c' is used out-of-position but is followed by an unnamed argument M(c:=1, 2,) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(c:=1, 2,)", invocation.ToString()) AssertEx.Equal({"Sub C.M(a As System.Int32, b As System.Int32, [c As System.Int32 = 1], [d As System.Int32 = 2])"}, model.GetSymbolInfo(invocation).CandidateSymbols.Select(Function(c) c.ToTestDisplayString())) End Sub <Fact> Public Sub TestNamedParams() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(ByVal ParamArray c() As Integer) End Sub Shared Sub Main() M(c:=1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(c:=1, 2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(c:=1, 2)", invocation.ToString()) AssertEx.Equal({"Sub C.M(ParamArray c As System.Int32())"}, model.GetSymbolInfo(invocation).CandidateSymbols.Select(Function(c) c.ToTestDisplayString())) End Sub <Fact> Public Sub TestNamedParams2() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(ParamArray x() As Integer) End Sub Shared Sub Main() M(1, x:=2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(1, x:=2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(1, x:=2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestTwiceNamedParams() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(ParamArray x() As Integer) End Sub Shared Sub Main() M(x:=1, x:=2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(x:=1, x:=2) ~ BC30587: Named argument cannot match a ParamArray parameter. M(x:=1, x:=2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(x:=1, x:=2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestTwiceNamedParameters() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(x As Integer, y As Integer, z As Integer) End Sub Shared Sub Main() M(x:=1, x:=2, 3) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30274: Parameter 'x' of 'Public Shared Sub M(x As Integer, y As Integer, z As Integer)' already has a matching argument. M(x:=1, x:=2, 3) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(x:=1, x:=2, 3)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestTwiceNamedParametersWithOldLangVer() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(x As Integer, y As Integer, z As Integer) End Sub Shared Sub Main() M(x:=1, x:=2, 3) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) comp.AssertTheseDiagnostics(<errors> BC30274: Parameter 'x' of 'Public Shared Sub M(x As Integer, y As Integer, z As Integer)' already has a matching argument. M(x:=1, x:=2, 3) ~ BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. M(x:=1, x:=2, 3) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(x:=1, x:=2, 3)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestNamedParams3() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(x As Integer, ParamArray y() As Integer) End Sub Shared Sub Main() M(y:=1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(y:=1, 2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(y:=1, 2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestNamedParams4() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(x As Integer, ParamArray y() As Integer) End Sub Shared Sub Main() M(x:=1, y:=2, 3) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(x:=1, y:=2, 3) ~ </errors>) End Sub <Fact> Public Sub TestNamedInvalidParams() Dim source = <compilation> <file name="Program.vb"> class C Shared Sub M(ParamArray x() As Integer, y As Integer) End Sub Shared Sub Main() M(x:=1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC30192: End of parameter list expected. Cannot define parameters after a paramarray parameter. Shared Sub M(ParamArray x() As Integer, y As Integer) ~~~~~~~~~~~~ BC30311: Value of type 'Integer' cannot be converted to 'Integer()'. M(x:=1, 2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().Single() Assert.Equal("M(x:=1, 2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestNamedParams5() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(x As Integer, ParamArray y() As Integer) System.Console.Write($"x={x} y(0)={y(0)} y.Length={y.Length}") End Sub Shared Sub Main() M(y:=1, x:=2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions, options:=TestOptions.DebugExe) comp.AssertTheseDiagnostics(<errors> BC30587: Named argument cannot match a ParamArray parameter. M(y:=1, x:=2) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(2) Assert.Equal("M(y:=1, x:=2)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestBadNonTrailing() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(Optional a As Integer = 1, Optional b As Integer = 2, Optional c As Integer = 3) System.Console.Write($"First a b. ") End Sub Shared Sub Main() Dim valueB = 2 Dim valueC = 3 M(c:=valueC, valueB) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC37302: Named argument 'c' is used out-of-position but is followed by an unnamed argument M(c:=valueC, valueB) ~ </errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim firstInvocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(c:=valueC, valueB)", firstInvocation.ToString()) Assert.Null(model.GetSymbolInfo(firstInvocation).Symbol) Assert.Equal(CandidateReason.OverloadResolutionFailure, model.GetSymbolInfo(firstInvocation).CandidateReason) Assert.Equal("Sub C.M([a As System.Int32 = 1], [b As System.Int32 = 2], [c As System.Int32 = 3])", model.GetSymbolInfo(firstInvocation).CandidateSymbols.Single().ToTestDisplayString()) End Sub <Fact> Public Sub TestPickGoodOverload() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(Optional a As Integer = 1, Optional b As Integer = 2, Optional c As Integer = 3) End Sub Shared Sub M(Optional c As Long = 1, Optional b As Long = 2) System.Console.Write($"Second {c} {b}. ") End Sub Shared Sub Main() Dim valueB = 2 Dim valueC = 3 M(c:=valueC, valueB) End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="Second 3 2.", parseOptions:=latestParseOptions) verifier.VerifyDiagnostics() Dim tree = verifier.Compilation.SyntaxTrees.First() Dim model = verifier.Compilation.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(c:=valueC, valueB)", invocation.ToString()) Assert.Equal("Sub C.M([c As System.Int64 = 1], [b As System.Int64 = 2])", model.GetSymbolInfo(invocation).Symbol.ToTestDisplayString()) End Sub <Fact> Public Sub TestPickGoodOverload2() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(Optional a As Long = 1, Optional b As Long = 2, Optional c As Long = 3) End Sub Shared Sub M(Optional c As Integer = 1, Optional b As Integer = 2) System.Console.Write($"Second {c} {b}.") End Sub Shared Sub Main() Dim valueB = 2 Dim valueC = 3 M(c:=valueC, valueB) End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="Second 3 2.", parseOptions:=latestParseOptions) verifier.VerifyDiagnostics() Dim tree = verifier.Compilation.SyntaxTrees.First() Dim model = verifier.Compilation.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of InvocationExpressionSyntax)().ElementAt(1) Assert.Equal("M(c:=valueC, valueB)", invocation.ToString()) Assert.Equal("Sub C.M([c As System.Int32 = 1], [b As System.Int32 = 2])", model.GetSymbolInfo(invocation).Symbol.ToTestDisplayString()) End Sub <Fact> Public Sub TestDynamicInvocation() Dim source = <compilation> <file name="Program.vb"> Option Strict Off Class C Shared Sub Main() Dim d = New Object() d.M(a:=1, 2) d.M(1, 2) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC37304: Named argument specifications must appear after all fixed arguments have been specified in a late bound invocation. d.M(a:=1, 2) ~ </errors>) Dim comp2 = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15)) comp2.AssertTheseDiagnostics(<errors> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. d.M(a:=1, 2) ~ </errors>) End Sub <Fact> Public Sub TestParams() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer, ParamArray c() As Integer) End Sub Shared Sub Main() M(b:=2, 3, 4) End Sub End Class </file> </compilation> Dim comp = CreateCompilationWithMscorlib45AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors> BC37302: Named argument 'b' is used out-of-position but is followed by an unnamed argument M(b:=2, 3, 4) ~ </errors>) End Sub <Fact> Public Sub TestParams2() Dim source = <compilation> <file name="Program.vb"> Class C Shared Sub M(a As Integer, b As Integer, ParamArray c() As Integer) System.Console.Write($"{a} {b} {c(0)} {c(1)} Length:{c.Length}") End Sub Shared Sub Main() M(1, b:=2, 3, 4) End Sub End Class </file> </compilation> Dim verifier = CompileAndVerify(source, expectedOutput:="1 2 3 4 Length:2", parseOptions:=latestParseOptions) verifier.VerifyDiagnostics() End Sub <Fact> Public Sub TestInAttribute() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Imports System <AttributeUsage(AttributeTargets.All, AllowMultiple:=True)> Public Class MyAttribute Inherits Attribute Public Dim P As Integer Public Dim condition As Boolean Public Sub New(condition As Boolean, other As Integer) End Sub End Class <MyAttribute(condition:=true, 42)> <MyAttribute(condition:=true, P:=1, 42)> <MyAttribute(42, condition:=True)> Public Class C End Class ]]></file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors><![CDATA[ BC30455: Argument not specified for parameter 'condition' of 'Public Sub New(condition As Boolean, other As Integer)'. <MyAttribute(condition:=true, 42)> ~~~~~~~~~~~ BC30455: Argument not specified for parameter 'other' of 'Public Sub New(condition As Boolean, other As Integer)'. <MyAttribute(condition:=true, 42)> ~~~~~~~~~~~ BC30661: Field or property '' is not found. <MyAttribute(condition:=true, 42)> ~ BC37303: Named argument expected. <MyAttribute(condition:=true, 42)> ~ BC30455: Argument not specified for parameter 'condition' of 'Public Sub New(condition As Boolean, other As Integer)'. <MyAttribute(condition:=true, P:=1, 42)> ~~~~~~~~~~~ BC30455: Argument not specified for parameter 'other' of 'Public Sub New(condition As Boolean, other As Integer)'. <MyAttribute(condition:=true, P:=1, 42)> ~~~~~~~~~~~ BC30661: Field or property '' is not found. <MyAttribute(condition:=true, P:=1, 42)> ~ BC37303: Named argument expected. <MyAttribute(condition:=true, P:=1, 42)> ~ BC30455: Argument not specified for parameter 'other' of 'Public Sub New(condition As Boolean, other As Integer)'. <MyAttribute(42, condition:=True)> ~~~~~~~~~~~ ]]></errors>) Dim tree = comp.SyntaxTrees.First() Dim model = comp.GetSemanticModel(tree) Dim nodes = tree.GetCompilationUnitRoot().DescendantNodes() Dim invocation = nodes.OfType(Of AttributeSyntax)().ElementAt(1) Assert.Equal("MyAttribute(condition:=true, 42)", invocation.ToString()) Assert.Null(model.GetSymbolInfo(invocation).Symbol) End Sub <Fact> Public Sub TestInAttribute2() Dim source = <compilation> <file name="Program.vb"><![CDATA[ Imports System <AttributeUsage(AttributeTargets.All, AllowMultiple:=True)> Public Class MyAttribute Inherits Attribute Public Dim P As Integer Public Dim c As Integer Public Sub New() End Sub End Class <MyAttribute(c:=3, 2)> <MyAttribute(P:=1, c:=3, 2)> Public Class C End Class ]]></file> </compilation> Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(source, parseOptions:=latestParseOptions) comp.AssertTheseDiagnostics(<errors><![CDATA[ BC30661: Field or property '' is not found. <MyAttribute(c:=3, 2)> ~ BC37303: Named argument expected. <MyAttribute(c:=3, 2)> ~ BC30661: Field or property '' is not found. <MyAttribute(P:=1, c:=3, 2)> ~ BC37303: Named argument expected. <MyAttribute(P:=1, c:=3, 2)> ~ ]]></errors>) End Sub <Fact> Public Sub OmittedArgumentAfterNamedArgument() Dim compilationDef = <compilation> <file name="a.vb"> Module Module1 Sub M(y As Integer, Optional z As Integer = 1) M(y:=Nothing,) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. M(y:=Nothing,) ~ </expected>) End Sub <Fact> Public Sub TestInIf() Dim compilationDef = <compilation> <file name="a.vb"> Module Module1 Sub M(b As Boolean) Dim x = If(b:=b, Nothing, Nothing) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC33105: 'If' operands cannot be named arguments. Dim x = If(b:=b, Nothing, Nothing) ~~~ </expected>) End Sub <Fact> Public Sub TestInIndexer() Dim compilationDef = <compilation> <file name="a.vb"> Class C Public ReadOnly Property P(ByVal index1 As Integer, Optional ByVal index2 As Integer = -1) As String Get Return System.String.Format($"{index1} {index2}") End Get End Property Sub M() System.Console.Write(P(index1:=1, 2)) System.Console.Write(P(index1:=1, )) System.Console.Write(P(index1:=1, 0 to 5)) End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15_3)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. System.Console.Write(P(index1:=1, 2)) ~ BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. System.Console.Write(P(index1:=1, )) ~ BC30241: Named argument expected. Please use language version 15.5 or greater to use non-trailing named arguments. System.Console.Write(P(index1:=1, 0 to 5)) ~ BC32017: Comma, ')', or a valid expression continuation expected. System.Console.Write(P(index1:=1, 0 to 5)) ~~~~ </expected>) End Sub <Fact> Public Sub TestInIndexer2() Dim compilationDef = <compilation> <file name="a.vb"> Class C Public ReadOnly Property P(ByVal index1 As Integer, Optional ByVal index2 As Integer = -1) As String Get Return System.String.Format($"{index1} {index2}. ") End Get End Property Sub M() System.Console.Write(P(index1:=1, 2)) System.Console.Write(P(index1:=3, )) System.Console.Write(P(index1:=4, index2:=5)) System.Console.Write(P(index2:=7, index1:=6)) End Sub Shared Sub Main() Dim c = New C() c.M() End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.Latest), options:=TestOptions.DebugExe) CompilationUtils.AssertNoDiagnostics(compilation) CompileAndVerify(compilation, expectedOutput:="1 2. 3 -1. 4 5. 6 7.") End Sub <Fact> Public Sub TestInConstructor() Dim compilationDef = <compilation> <file name="a.vb"> Class C Public Sub New(input1 As Integer, Optional input2 As Integer = 2, Optional input3 As Integer = 3) End Sub Shared Sub Main() Dim c = New C(input1:=1, , bad:=3) End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.Latest), options:=TestOptions.DebugExe) CompilationUtils.AssertTheseDiagnostics(compilation, <errors> BC30272: 'bad' is not a parameter of 'Public Sub New(input1 As Integer, [input2 As Integer = 2], [input3 As Integer = 3])'. Dim c = New C(input1:=1, , bad:=3) ~~~ </errors>) End Sub <Fact> Public Sub TestInConstructor2() Dim compilationDef = <compilation> <file name="a.vb"> Class C Public Sub New(input1 As Integer, Optional input2 As Integer = 2, Optional input3 As Integer = 3) System.Console.Write($"{input1} {input2} {input3}. ") End Sub Shared Sub Main() Dim c = New C(input1:=1, , 3) c = New C(input1:=1, , 0 to 4) c = New C(input1:=1, , input3:=5) c = New C(input1:=1, 0 to 6, input3:=7) End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.Latest), options:=TestOptions.DebugExe) CompilationUtils.AssertNoDiagnostics(compilation) CompileAndVerify(compilation, expectedOutput:="1 2 3. 1 2 4. 1 2 5. 1 6 7.") End Sub End Class End Namespace