|
' 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 System.Collections.Immutable
Imports System.IO
Imports System.Reflection.PortableExecutable
Imports System.Runtime.InteropServices
Imports System.Security.Cryptography
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Emit
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests
Imports Roslyn.Test.Utilities
Imports Roslyn.Test.Utilities.TestHelpers
Imports Basic.Reference.Assemblies
Imports CS = Microsoft.CodeAnalysis.CSharp
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
Public Class CompilationAPITests
Inherits BasicTestBase
Private Function WithDiagnosticOptions(
tree As SyntaxTree,
ParamArray options As (String, ReportDiagnostic)()) As VisualBasicCompilationOptions
Return TestOptions.DebugDll.
WithSyntaxTreeOptionsProvider(New TestSyntaxTreeOptionsProvider(tree, options))
End Function
<Fact>
Public Sub PerTreeVsGlobalSuppress()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
Dim x As Integer
End Sub
End Class")
Dim options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary).
WithGeneralDiagnosticOption(ReportDiagnostic.Suppress)
Dim comp = CreateCompilationWithMscorlib461({tree}, options:=options)
comp.AssertNoDiagnostics()
options = options.WithSyntaxTreeOptionsProvider(
New TestSyntaxTreeOptionsProvider(tree, ("BC42024", ReportDiagnostic.Warn)))
comp = CreateCompilationWithMscorlib461({tree}, options:=options)
' Global options override syntax tree options. This is the opposite of C# behavior
comp.AssertNoDiagnostics()
End Sub
<Fact>
Public Sub PerTreeDiagnosticOptionsParseWarnings()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
Dim x As Integer
End Sub
End Class")
Dim comp = CreateCompilation({tree}, options:=TestOptions.DebugDll)
comp.AssertTheseDiagnostics(
<errors>
BC42024: Unused local variable: 'x'.
Dim x As Integer
~
</errors>)
Dim options = WithDiagnosticOptions(tree, ("BC42024", ReportDiagnostic.Suppress))
Dim comp2 = CreateCompilation({tree}, options:=options)
comp2.AssertNoDiagnostics()
End Sub
<Fact>
Public Sub PerTreeDiagnosticOptionsVsPragma()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
#Disable Warning BC42024
Dim x As Integer
#Enable Warning BC42024
End Sub
End Class")
Dim comp = CreateCompilation({tree}, options:=TestOptions.DebugDll)
comp.AssertNoDiagnostics()
Dim options = WithDiagnosticOptions(tree, ("BC42024", ReportDiagnostic.Warn))
Dim comp2 = CreateCompilation({tree}, options:=options)
' Pragma should have precedence over per-tree options
comp2.AssertNoDiagnostics()
End Sub
<Fact>
Public Sub PerTreeDiagnosticOptionsVsSpecificOptions()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
Dim x As Integer
End Sub
End Class")
Dim options = TestOptions.DebugDll.WithSpecificDiagnosticOptions(
CreateImmutableDictionary(("BC42024", ReportDiagnostic.Suppress)))
Dim comp = CreateCompilationWithMscorlib461({tree}, options:=options)
comp.AssertNoDiagnostics()
options = options.WithSyntaxTreeOptionsProvider(
New TestSyntaxTreeOptionsProvider(tree, ("BC42024", ReportDiagnostic.Error)))
Dim comp2 = CreateCompilationWithMscorlib461({tree}, options:=options)
' Specific diagnostic options should have precedence over tree options
comp2.AssertNoDiagnostics()
End Sub
<Fact>
Public Sub DifferentDiagnosticOptionsForTrees()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
Dim x As Integer
End Sub
End Class")
Dim newTree = SyntaxFactory.ParseSyntaxTree("
Class D
Sub M()
Dim y As Integer
End Sub
End Class")
Dim options = TestOptions.DebugDll.WithSyntaxTreeOptionsProvider(
New TestSyntaxTreeOptionsProvider(
(tree, {("BC42024", ReportDiagnostic.Suppress)}),
(newTree, {("BC4024", ReportDiagnostic.Error)})))
Dim comp = CreateCompilationWithMscorlib461({tree, newTree}, options:=options)
comp.AssertTheseDiagnostics(
<errors>
BC42024: Unused local variable: 'y'.
Dim y As Integer
~
</errors>)
End Sub
<Fact>
Public Sub TreeOptionsComparerRespected()
Dim tree = SyntaxFactory.ParseSyntaxTree("
Class C
Sub M()
Dim x As Integer
End Sub
End Class")
' Default provider is case insensitive
Dim options = WithDiagnosticOptions(tree, ("bc42024", ReportDiagnostic.Suppress))
Dim comp = CreateCompilation(tree, options:=options)
comp.AssertNoDiagnostics()
options = options.WithSyntaxTreeOptionsProvider(
New TestSyntaxTreeOptionsProvider(
StringComparer.Ordinal,
Nothing,
(tree, {("bc42024", ReportDiagnostic.Suppress)}))
)
comp = CreateCompilation(tree, options:=options)
comp.AssertTheseDiagnostics(
<errors>
BC42024: Unused local variable: 'x'.
Dim x As Integer
~
</errors>)
End Sub
<WorkItem(8360, "https://github.com/dotnet/roslyn/issues/8360")>
<WorkItem(9153, "https://github.com/dotnet/roslyn/issues/9153")>
<Fact>
Public Sub PublicSignWithRelativeKeyPath()
Dim options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary).
WithPublicSign(True).WithCryptoKeyFile("test.snk")
AssertTheseDiagnostics(VisualBasicCompilation.Create("test", options:=options),
<errors>
BC37254: Public sign was specified and requires a public key, but no public key was specified
BC37257: Option 'CryptoKeyFile' must be an absolute path.
</errors>)
End Sub
<WorkItem(11497, "https://github.com/dotnet/roslyn/issues/11497")>
<Fact>
Public Sub PublicSignWithEmptyKeyPath()
Dim options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary).
WithPublicSign(True).WithCryptoKeyFile("")
AssertTheseDiagnostics(VisualBasicCompilation.Create("test", options:=options),
<errors>
BC37254: Public sign was specified and requires a public key, but no public key was specified
</errors>)
End Sub
<WorkItem(11497, "https://github.com/dotnet/roslyn/issues/11497")>
<Fact>
Public Sub PublicSignWithEmptyKeyPath2()
Dim options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary).
WithPublicSign(True).WithCryptoKeyFile("""""")
AssertTheseDiagnostics(VisualBasicCompilation.Create("test", options:=options),
<errors>
BC37254: Public sign was specified and requires a public key, but no public key was specified
BC37257: Option 'CryptoKeyFile' must be an absolute path.
</errors>)
End Sub
<Fact>
Public Sub LocalizableErrorArgumentToStringDoesntStackOverflow()
' Error ID is arbitrary
Dim arg = New LocalizableErrorArgument(ERRID.IDS_ProjectSettingsLocationName)
Assert.NotNull(arg.ToString())
End Sub
<WorkItem(538778, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538778")>
<WorkItem(537623, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537623")>
<WorkItem(233669, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=233669")>
<Fact>
Public Sub CompilationName()
' report an error, rather then silently ignoring the directory
' (see cli partition II 22.30)
VisualBasicCompilation.Create("C:/goo/Test.exe").AssertTheseEmitDiagnostics(
<expected>
BC30420: 'Sub Main' was not found in 'C:/goo/Test.exe'.
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create("C:\goo\Test.exe", options:=TestOptions.ReleaseDll).AssertTheseDeclarationDiagnostics(
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create("\goo/Test.exe", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create("C:Test.exe", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create("Te" & ChrW(0) & "st.exe", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create(" " & vbTab & " ", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name cannot start with whitespace.
</expected>)
VisualBasicCompilation.Create(ChrW(&HD800), options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
VisualBasicCompilation.Create("", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name cannot be empty.
</expected>)
VisualBasicCompilation.Create(" a", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics(
<expected>
BC37283: Invalid assembly name: Name cannot start with whitespace.
</expected>)
VisualBasicCompilation.Create("\u2000a", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics( ' // U+2000 is whitespace
<expected>
BC37283: Invalid assembly name: Name contains invalid characters.
</expected>)
' other characters than directory separators are ok:
VisualBasicCompilation.Create(";,*?<>#!@&", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics()
VisualBasicCompilation.Create("goo", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics()
VisualBasicCompilation.Create(".goo", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics()
VisualBasicCompilation.Create("goo ", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics() ' can end with whitespace
VisualBasicCompilation.Create("....", options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics()
VisualBasicCompilation.Create(Nothing, options:=TestOptions.ReleaseDll).AssertTheseEmitDiagnostics()
End Sub
<Fact>
Public Sub CreateAPITest()
Dim listSyntaxTree = New List(Of SyntaxTree)
Dim listRef = New List(Of MetadataReference)
Dim s1 = "using Goo"
Dim t1 As SyntaxTree = VisualBasicSyntaxTree.ParseText(s1)
listSyntaxTree.Add(t1)
' System.dll
listRef.Add(NetFramework.System)
Dim ops = TestOptions.ReleaseExe
' Create Compilation with Option is not Nothing
Dim comp = VisualBasicCompilation.Create("Compilation", listSyntaxTree, listRef, ops)
Assert.Equal(ops, comp.Options)
Assert.NotNull(comp.SyntaxTrees)
Assert.NotNull(comp.References)
Assert.Equal(1, comp.SyntaxTrees.Count)
Assert.Equal(1, comp.References.Count)
' Create Compilation with PreProcessorSymbols of Option is empty
Dim ops1 = TestOptions.ReleaseExe.WithGlobalImports(GlobalImport.Parse({"System", "Microsoft.VisualBasic"})).WithRootNamespace("")
' Create Compilation with Assembly name contains invalid char
Dim asmname = "楽聖いち にÅÅ€"
comp = VisualBasicCompilation.Create(asmname, listSyntaxTree, listRef, ops1)
Assert.Equal(asmname, comp.Assembly.Name)
Assert.Equal(asmname + ".exe", comp.SourceModule.Name)
Dim compOpt = VisualBasicCompilation.Create("Compilation", Nothing, Nothing, Nothing)
Assert.NotNull(compOpt.Options)
' Not Implemented code
' comp = comp.ChangeOptions(options:=null)
' Assert.Equal(CompilationOptions.Default, comp.Options)
' comp = comp.ChangeOptions(ops1)
' Assert.Equal(ops1, comp.Options)
' comp = comp.ChangeOptions(comp1.Options)
' ssert.Equal(comp1.Options, comp.Options)
' comp = comp.ChangeOptions(CompilationOptions.Default)
' Assert.Equal(CompilationOptions.Default, comp.Options)
End Sub
<Fact>
Public Sub GetSpecialType()
Dim comp = DirectCast(VisualBasicCompilation.Create("compilation", Nothing, Nothing, Nothing), Compilation)
' Get Special Type by enum
Dim ntSmb = comp.GetSpecialType(typeId:=SpecialType.Count)
Assert.Equal(SpecialType.Count, ntSmb.SpecialType)
' Get Special Type by integer
ntSmb = comp.GetSpecialType(CType(31, SpecialType))
Assert.Equal(31, CType(ntSmb.SpecialType, Integer))
End Sub
<Fact>
Public Sub GetTypeByMetadataName()
Dim comp = VisualBasicCompilation.Create("compilation", Nothing, Nothing, Nothing)
' Get Type Name And Arity
Assert.Null(comp.GetTypeByMetadataName("`1"))
Assert.Null(comp.GetTypeByMetadataName("中文`1"))
' Throw exception when the parameter of GetTypeByNameAndArity is NULL
'Assert.Throws(Of Exception)(
' Sub()
' comp.GetTypeByNameAndArity(fullName:=Nothing, arity:=1)
' End Sub)
' Throw exception when the parameter of GetTypeByNameAndArity is less than 0
'Assert.Throws(Of Exception)(
' Sub()
' comp.GetTypeByNameAndArity(String.Empty, -4)
' End Sub)
Dim compilationDef =
<compilation name="compilation">
<file name="a.vb">
Namespace A.B
Class C
Class D
Class E
End Class
End Class
End Class
Class G(Of T)
Class Q(Of S1,S2)
ENd Class
End Class
Class G(Of T1,T2)
End Class
End Namespace
Class C
Class D
Class E
End Class
End Class
End Class
</file>
</compilation>
comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
'IsCaseSensitive
AssertEx.Equal(Of Boolean)(False, comp.IsCaseSensitive)
Assert.Equal("D", comp.GetTypeByMetadataName("C+D").Name)
Assert.Equal("E", comp.GetTypeByMetadataName("C+D+E").Name)
Assert.Null(comp.GetTypeByMetadataName(""))
Assert.Null(comp.GetTypeByMetadataName("+"))
Assert.Null(comp.GetTypeByMetadataName("++"))
Assert.Equal("C", comp.GetTypeByMetadataName("A.B.C").Name)
Assert.Equal("D", comp.GetTypeByMetadataName("A.B.C+D").Name)
Assert.Null(comp.GetTypeByMetadataName("A.B.C+F"))
Assert.Equal("E", comp.GetTypeByMetadataName("A.B.C+D+E").Name)
Assert.Null(comp.GetTypeByMetadataName("A.B.C+D+E+F"))
Assert.Equal(1, comp.GetTypeByMetadataName("A.B.G`1").Arity)
Assert.Equal(2, comp.GetTypeByMetadataName("A.B.G`1+Q`2").Arity)
Assert.Equal(2, comp.GetTypeByMetadataName("A.B.G`2").Arity)
Assert.Null(comp.GetTypeByMetadataName("c"))
Assert.Null(comp.GetTypeByMetadataName("A.b.C"))
Assert.Null(comp.GetTypeByMetadataName("C+d"))
Assert.Equal(SpecialType.System_Array, comp.GetTypeByMetadataName("System.Array").SpecialType)
Assert.Null(comp.Assembly.GetTypeByMetadataName("System.Array"))
Assert.Equal("E", comp.Assembly.GetTypeByMetadataName("A.B.C+D+E").Name)
End Sub
<Fact>
Public Sub EmitToMemoryStreams()
Dim comp = VisualBasicCompilation.Create("Compilation", options:=TestOptions.ReleaseDll)
Using output = New MemoryStream()
Using outputPdb = New MemoryStream()
Using outputxml = New MemoryStream()
Dim result = comp.Emit(output, outputPdb, Nothing)
Assert.True(result.Success)
result = comp.Emit(output, outputPdb)
Assert.True(result.Success)
result = comp.Emit(peStream:=output, pdbStream:=outputPdb, xmlDocumentationStream:=Nothing, cancellationToken:=Nothing)
Assert.True(result.Success)
result = comp.Emit(peStream:=output, pdbStream:=outputPdb, cancellationToken:=Nothing)
Assert.True(result.Success)
result = comp.Emit(output, outputPdb)
Assert.True(result.Success)
result = comp.Emit(output, outputPdb)
Assert.True(result.Success)
result = comp.Emit(output, outputPdb, outputxml)
Assert.True(result.Success)
result = comp.Emit(output, Nothing, Nothing, Nothing)
Assert.True(result.Success)
result = comp.Emit(output)
Assert.True(result.Success)
result = comp.Emit(output, Nothing, outputxml)
Assert.True(result.Success)
result = comp.Emit(output, xmlDocumentationStream:=outputxml)
Assert.True(result.Success)
result = comp.Emit(output, Nothing, outputxml)
Assert.True(result.Success)
result = comp.Emit(output, xmlDocumentationStream:=outputxml)
Assert.True(result.Success)
End Using
End Using
End Using
End Sub
<Fact>
Public Sub Emit_BadArgs()
Dim comp = VisualBasicCompilation.Create("Compilation", options:=TestOptions.ReleaseDll)
Assert.Throws(Of ArgumentNullException)("peStream", Sub() comp.Emit(peStream:=Nothing))
Assert.Throws(Of ArgumentException)("peStream", Sub() comp.Emit(peStream:=New TestStream(canRead:=True, canWrite:=False, canSeek:=True)))
Assert.Throws(Of ArgumentException)("pdbStream", Sub() comp.Emit(peStream:=New MemoryStream(), pdbStream:=New TestStream(canRead:=True, canWrite:=False, canSeek:=True)))
Assert.Throws(Of ArgumentException)("pdbStream", Sub() comp.Emit(peStream:=New MemoryStream(), pdbStream:=New MemoryStream(), options:=EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.Embedded)))
Assert.Throws(Of ArgumentException)("sourceLinkStream", Sub() comp.Emit(
peStream:=New MemoryStream(),
pdbStream:=New MemoryStream(),
options:=EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.PortablePdb),
sourceLinkStream:=New TestStream(canRead:=False, canWrite:=True, canSeek:=True)))
Assert.Throws(Of ArgumentException)("embeddedTexts", Sub() comp.Emit(
peStream:=New MemoryStream(),
pdbStream:=Nothing,
options:=Nothing,
embeddedTexts:={EmbeddedText.FromStream("_", New MemoryStream())}))
Assert.Throws(Of ArgumentException)("embeddedTexts", Sub() comp.Emit(
peStream:=New MemoryStream(),
pdbStream:=Nothing,
options:=EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.PortablePdb),
embeddedTexts:={EmbeddedText.FromStream("_", New MemoryStream())}))
Assert.Throws(Of ArgumentException)("win32Resources", Sub() comp.Emit(
peStream:=New MemoryStream(),
win32Resources:=New TestStream(canRead:=True, canWrite:=False, canSeek:=False)))
Assert.Throws(Of ArgumentException)("win32Resources", Sub() comp.Emit(
peStream:=New MemoryStream(),
win32Resources:=New TestStream(canRead:=False, canWrite:=False, canSeek:=True)))
' we don't report an error when we can't write to the XML doc stream:
Assert.True(comp.Emit(
peStream:=New MemoryStream(),
pdbStream:=New MemoryStream(),
xmlDocumentationStream:=New TestStream(canRead:=True, canWrite:=False, canSeek:=True)).Success)
End Sub
<Fact>
Public Sub EmitOptionsDiagnostics()
Dim c = CreateCompilationWithMscorlib40({"class C {}"})
Dim stream = New MemoryStream()
Dim options = New EmitOptions(
debugInformationFormat:=CType(-1, DebugInformationFormat),
outputNameOverride:=" ",
fileAlignment:=513,
subsystemVersion:=SubsystemVersion.Create(1000000, -1000000),
pdbChecksumAlgorithm:=New HashAlgorithmName("invalid hash algorithm name"))
Dim result = c.Emit(stream, options:=options)
result.Diagnostics.Verify(
Diagnostic(ERRID.ERR_InvalidDebugInformationFormat).WithArguments("-1"),
Diagnostic(ERRID.ERR_InvalidOutputName).WithArguments("Name cannot start with whitespace."),
Diagnostic(ERRID.ERR_InvalidFileAlignment).WithArguments("513"),
Diagnostic(ERRID.ERR_InvalidSubsystemVersion).WithArguments("1000000.-1000000"),
Diagnostic(ERRID.ERR_InvalidHashAlgorithmName).WithArguments("invalid hash algorithm name"))
Assert.False(result.Success)
End Sub
<Fact>
Sub EmitOptions_PdbChecksumAndDeterminism()
Dim options = New EmitOptions(pdbChecksumAlgorithm:=New HashAlgorithmName())
Dim diagnosticBag = New DiagnosticBag()
options.ValidateOptions(diagnosticBag, MessageProvider.Instance, isDeterministic:=True)
diagnosticBag.Verify(
Diagnostic(ERRID.ERR_InvalidHashAlgorithmName).WithArguments(""))
diagnosticBag.Clear()
options.ValidateOptions(diagnosticBag, MessageProvider.Instance, isDeterministic:=False)
diagnosticBag.Verify()
End Sub
<Fact>
Public Sub ReferenceAPITest()
' Create Compilation takes two args
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim ref1 = NetFramework.mscorlib
Dim ref2 = NetFramework.System
Dim ref3 = New TestMetadataReference(fullPath:="c:\xml.bms")
Dim ref4 = New TestMetadataReference(fullPath:="c:\aaa.dll")
' Add a new empty item
comp = comp.AddReferences(Enumerable.Empty(Of MetadataReference)())
Assert.Equal(0, comp.References.Count)
' Add a new valid item
comp = comp.AddReferences(ref1)
Dim assemblySmb = comp.GetReferencedAssemblySymbol(ref1)
Assert.NotNull(assemblySmb)
Assert.Equal("mscorlib", assemblySmb.Name, StringComparer.OrdinalIgnoreCase)
Assert.Equal(1, comp.References.Count)
Assert.Equal(MetadataImageKind.Assembly, comp.References(0).Properties.Kind)
Assert.Same(ref1, comp.References(0))
' Replace an existing item with another valid item
comp = comp.ReplaceReference(ref1, ref2)
Assert.Equal(1, comp.References.Count)
Assert.Equal(MetadataImageKind.Assembly, comp.References(0).Properties.Kind)
Assert.Equal(ref2, comp.References(0))
' Remove an existing item
comp = comp.RemoveReferences(ref2)
Assert.Equal(0, comp.References.Count)
'WithReferences
Dim hs1 As New HashSet(Of MetadataReference) From {ref1, ref2, ref3}
Dim compCollection1 = VisualBasicCompilation.Create("Compilation")
AssertEx.Equal(Of Integer)(0, Enumerable.Count(Of MetadataReference)(compCollection1.References))
Dim c2 As Compilation = compCollection1.WithReferences(hs1)
AssertEx.Equal(Of Integer)(3, Enumerable.Count(Of MetadataReference)(c2.References))
'WithReferences
Dim compCollection2 = VisualBasicCompilation.Create("Compilation")
AssertEx.Equal(Of Integer)(0, Enumerable.Count(Of MetadataReference)(compCollection2.References))
Dim c3 As Compilation = compCollection1.WithReferences(ref1, ref2, ref3)
AssertEx.Equal(Of Integer)(3, Enumerable.Count(Of MetadataReference)(c3.References))
'ReferencedAssemblyNames
Dim RefAsm_Names As IEnumerable(Of AssemblyIdentity) = c2.ReferencedAssemblyNames
AssertEx.Equal(Of Integer)(2, Enumerable.Count(Of AssemblyIdentity)(RefAsm_Names))
Dim ListNames As New List(Of String)
Dim I As AssemblyIdentity
For Each I In RefAsm_Names
ListNames.Add(I.Name)
Next
Assert.Contains(Of String)("mscorlib", ListNames)
Assert.Contains(Of String)("System", ListNames)
'RemoveAllReferences
c2 = c2.RemoveAllReferences
AssertEx.Equal(Of Integer)(0, Enumerable.Count(Of MetadataReference)(c2.References))
' Overload with Hashset
Dim hs = New HashSet(Of MetadataReference)() From {ref1, ref2, ref3}
Dim compCollection = VisualBasicCompilation.Create("Compilation", references:=hs)
compCollection = compCollection.AddReferences(ref1, ref2, ref3, ref4).RemoveReferences(hs)
Assert.Equal(1, compCollection.References.Count)
compCollection = compCollection.AddReferences(hs).RemoveReferences(ref1, ref2, ref3, ref4)
Assert.Equal(0, compCollection.References.Count)
' Overload with Collection
Dim col = New ObjectModel.Collection(Of MetadataReference)() From {ref1, ref2, ref3}
compCollection = VisualBasicCompilation.Create("Compilation", references:=col)
compCollection = compCollection.AddReferences(col).RemoveReferences(ref1, ref2, ref3)
Assert.Equal(0, compCollection.References.Count)
compCollection = compCollection.AddReferences(ref1, ref2, ref3).RemoveReferences(col)
Assert.Equal(0, comp.References.Count)
' Overload with ConcurrentStack
Dim stack = New Concurrent.ConcurrentStack(Of MetadataReference)
stack.Push(ref1)
stack.Push(ref2)
stack.Push(ref3)
compCollection = VisualBasicCompilation.Create("Compilation", references:=stack)
compCollection = compCollection.AddReferences(stack).RemoveReferences(ref1, ref3, ref2)
Assert.Equal(0, compCollection.References.Count)
compCollection = compCollection.AddReferences(ref2, ref1, ref3).RemoveReferences(stack)
Assert.Equal(0, compCollection.References.Count)
' Overload with ConcurrentQueue
Dim queue = New Concurrent.ConcurrentQueue(Of MetadataReference)
queue.Enqueue(ref1)
queue.Enqueue(ref2)
queue.Enqueue(ref3)
compCollection = VisualBasicCompilation.Create("Compilation", references:=queue)
compCollection = compCollection.AddReferences(queue).RemoveReferences(ref3, ref2, ref1)
Assert.Equal(0, compCollection.References.Count)
compCollection = compCollection.AddReferences(ref2, ref1, ref3).RemoveReferences(queue)
Assert.Equal(0, compCollection.References.Count)
End Sub
<WorkItem(537826, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537826")>
<Fact>
Public Sub SyntreeAPITest()
Dim s1 = "using System.Linq;"
Dim s2 = <![CDATA[Class goo
sub main
Public Operator
End Operator
End Class
]]>.Value
Dim s3 = "Imports s$ = System.Text"
Dim s4 = <text>
Module Module1
Sub Goo()
for i = 0 to 100
next
end sub
End Module
</text>.Value
Dim t1 = VisualBasicSyntaxTree.ParseText(s4)
Dim withErrorTree = VisualBasicSyntaxTree.ParseText(s2)
Dim withErrorTree1 = VisualBasicSyntaxTree.ParseText(s3)
Dim withErrorTreeCS = VisualBasicSyntaxTree.ParseText(s1)
Dim withExpressionRootTree = SyntaxFactory.ParseExpression("0").SyntaxTree
' Create compilation takes three args
Dim comp = VisualBasicCompilation.Create("Compilation",
{t1},
{MscorlibRef, MsvbRef},
TestOptions.ReleaseDll)
Dim tree = comp.SyntaxTrees.AsEnumerable()
comp.VerifyDiagnostics()
' Add syntaxtree with error
comp = comp.AddSyntaxTrees(withErrorTreeCS)
Assert.Equal(2, comp.GetDiagnostics().Length())
' Remove syntaxtree without error
comp = comp.RemoveSyntaxTrees(tree)
Assert.Equal(2, comp.GetDiagnostics(cancellationToken:=CancellationToken.None).Length())
' Remove syntaxtree with error
comp = comp.RemoveSyntaxTrees(withErrorTreeCS)
Assert.Equal(0, comp.GetDiagnostics().Length())
Assert.Equal(0, comp.GetDeclarationDiagnostics().Length())
' Get valid binding
Dim bind = comp.GetSemanticModel(syntaxTree:=t1)
Assert.NotNull(bind)
' Get Binding with tree is not exist
bind = comp.GetSemanticModel(withErrorTree)
Assert.NotNull(bind)
' Add syntaxtree which is CS language
comp = comp.AddSyntaxTrees(withErrorTreeCS)
Assert.Equal(2, comp.GetDiagnostics().Length())
comp = comp.RemoveSyntaxTrees(withErrorTreeCS)
Assert.Equal(0, comp.GetDiagnostics().Length())
comp = comp.AddSyntaxTrees(t1, withErrorTree, withErrorTree1, withErrorTreeCS)
comp = comp.RemoveSyntaxTrees(t1, withErrorTree, withErrorTree1, withErrorTreeCS)
' Add a new empty item
comp = comp.AddSyntaxTrees(Enumerable.Empty(Of SyntaxTree))
Assert.Equal(0, comp.SyntaxTrees.Length)
' Add a new valid item
comp = comp.AddSyntaxTrees(t1)
Assert.Equal(1, comp.SyntaxTrees.Length)
comp = comp.AddSyntaxTrees(VisualBasicSyntaxTree.ParseText(s4))
Assert.Equal(2, comp.SyntaxTrees.Length)
' Replace an existing item with another valid item
comp = comp.ReplaceSyntaxTree(t1, VisualBasicSyntaxTree.ParseText(s4))
Assert.Equal(2, comp.SyntaxTrees.Length)
' Replace an existing item with same item
comp = comp.AddSyntaxTrees(t1).ReplaceSyntaxTree(t1, t1)
Assert.Equal(3, comp.SyntaxTrees.Length)
' Replace with existing and verify that it throws
Assert.Throws(Of ArgumentException)(Sub() comp.ReplaceSyntaxTree(t1, comp.SyntaxTrees(0)))
Assert.Throws(Of ArgumentException)(Sub() comp.AddSyntaxTrees(t1))
' SyntaxTrees have reference equality. This removal should fail.
Assert.Throws(Of ArgumentException)(Sub() comp = comp.RemoveSyntaxTrees(VisualBasicSyntaxTree.ParseText(s4)))
Assert.Equal(3, comp.SyntaxTrees.Length)
' Remove non-existing item
Assert.Throws(Of ArgumentException)(Sub() comp = comp.RemoveSyntaxTrees(withErrorTree))
Assert.Equal(3, comp.SyntaxTrees.Length)
Dim t4 = VisualBasicSyntaxTree.ParseText("Using System;")
Dim t5 = VisualBasicSyntaxTree.ParseText("Usingsssssssssssss System;")
Dim t6 = VisualBasicSyntaxTree.ParseText("Import System")
' Overload with Hashset
Dim hs = New HashSet(Of SyntaxTree) From {t4, t5, t6}
Dim compCollection = VisualBasicCompilation.Create("Compilation", syntaxTrees:=hs)
compCollection = compCollection.RemoveSyntaxTrees(hs)
Assert.Equal(0, compCollection.SyntaxTrees.Length)
compCollection = compCollection.AddSyntaxTrees(hs).RemoveSyntaxTrees(t4, t5, t6)
Assert.Equal(0, compCollection.SyntaxTrees.Length)
' Overload with Collection
Dim col = New ObjectModel.Collection(Of SyntaxTree) From {t4, t5, t6}
compCollection = VisualBasicCompilation.Create("Compilation", syntaxTrees:=col)
compCollection = compCollection.RemoveSyntaxTrees(t4, t5, t6)
Assert.Equal(0, compCollection.SyntaxTrees.Length)
Assert.Throws(Of ArgumentException)(Sub() compCollection = compCollection.AddSyntaxTrees(t4, t5).RemoveSyntaxTrees(col))
Assert.Equal(0, compCollection.SyntaxTrees.Length)
' Overload with ConcurrentStack
Dim stack = New Concurrent.ConcurrentStack(Of SyntaxTree)
stack.Push(t4)
stack.Push(t5)
stack.Push(t6)
compCollection = VisualBasicCompilation.Create("Compilation", syntaxTrees:=stack)
compCollection = compCollection.RemoveSyntaxTrees(t4, t6, t5)
Assert.Equal(0, compCollection.SyntaxTrees.Length)
Assert.Throws(Of ArgumentException)(Sub() compCollection = compCollection.AddSyntaxTrees(t4, t6).RemoveSyntaxTrees(stack))
Assert.Equal(0, compCollection.SyntaxTrees.Length)
' Overload with ConcurrentQueue
Dim queue = New Concurrent.ConcurrentQueue(Of SyntaxTree)
queue.Enqueue(t4)
queue.Enqueue(t5)
queue.Enqueue(t6)
compCollection = VisualBasicCompilation.Create("Compilation", syntaxTrees:=queue)
compCollection = compCollection.RemoveSyntaxTrees(t4, t6, t5)
Assert.Equal(0, compCollection.SyntaxTrees.Length)
Assert.Throws(Of ArgumentException)(Sub() compCollection = compCollection.AddSyntaxTrees(t4, t6).RemoveSyntaxTrees(queue))
Assert.Equal(0, compCollection.SyntaxTrees.Length)
' VisualBasicCompilation.Create with syntaxtree with a non-CompilationUnit root node: should throw an ArgumentException.
Assert.False(withExpressionRootTree.HasCompilationUnitRoot, "how did we get a CompilationUnit root?")
Assert.Throws(Of ArgumentException)(Sub() VisualBasicCompilation.Create("Compilation", syntaxTrees:={withExpressionRootTree}))
' AddSyntaxTrees with a non-CompilationUnit root node: should throw an ArgumentException.
Assert.Throws(Of ArgumentException)(Sub() comp.AddSyntaxTrees(withExpressionRootTree))
' ReplaceSyntaxTrees syntaxtree with a non-CompilationUnit root node: should throw an ArgumentException.
Assert.Throws(Of ArgumentException)(Sub() comp.ReplaceSyntaxTree(comp.SyntaxTrees(0), withExpressionRootTree))
End Sub
<Fact>
Public Sub ChainedOperations()
Dim s1 = "using System.Linq;"
Dim s2 = ""
Dim s3 = "Import System"
Dim t1 = VisualBasicSyntaxTree.ParseText(s1)
Dim t2 = VisualBasicSyntaxTree.ParseText(s2)
Dim t3 = VisualBasicSyntaxTree.ParseText(s3)
Dim listSyntaxTree = New List(Of SyntaxTree)
listSyntaxTree.Add(t1)
listSyntaxTree.Add(t2)
' Remove second SyntaxTree
Dim comp = VisualBasicCompilation.Create("Compilation")
comp = comp.AddSyntaxTrees(listSyntaxTree).RemoveSyntaxTrees(t2)
Assert.Equal(1, comp.SyntaxTrees.Length)
'ContainsSyntaxTree
Dim b1 As Boolean = comp.ContainsSyntaxTree(t2)
AssertEx.Equal(Of Boolean)(False, b1)
comp = comp.AddSyntaxTrees({t2})
b1 = comp.ContainsSyntaxTree(t2)
AssertEx.Equal(Of Boolean)(True, b1)
Dim xt As SyntaxTree = Nothing
AssertEx.Equal(Of Boolean)(False, comp.ContainsSyntaxTree(xt))
comp = comp.RemoveSyntaxTrees({t2})
Assert.Equal(1, comp.SyntaxTrees.Length)
comp = comp.AddSyntaxTrees({t2})
Assert.Equal(2, comp.SyntaxTrees.Length)
'RemoveAllSyntaxTrees
comp = comp.RemoveAllSyntaxTrees
Assert.Equal(0, comp.SyntaxTrees.Length)
comp = VisualBasicCompilation.Create("Compilation").AddSyntaxTrees(listSyntaxTree).RemoveSyntaxTrees({t2})
AssertEx.Equal(Of Integer)(1, comp.SyntaxTrees.Length)
AssertEx.Equal(Of String)("Object", comp.ObjectType.Name)
' Remove mid SyntaxTree
listSyntaxTree.Add(t3)
comp = comp.RemoveSyntaxTrees(t1).AddSyntaxTrees(listSyntaxTree).RemoveSyntaxTrees(t2)
Assert.Equal(2, comp.SyntaxTrees.Length)
' remove list
listSyntaxTree.Remove(t2)
comp = comp.AddSyntaxTrees().RemoveSyntaxTrees(listSyntaxTree)
comp = comp.AddSyntaxTrees(listSyntaxTree).RemoveSyntaxTrees(listSyntaxTree)
Assert.Equal(0, comp.SyntaxTrees.Length)
listSyntaxTree.Clear()
listSyntaxTree.Add(t1)
' Chained operation count > 2
comp = comp.AddSyntaxTrees(listSyntaxTree).AddReferences().ReplaceSyntaxTree(t1, t2)
Assert.Equal(1, comp.SyntaxTrees.Length)
Assert.Equal(0, comp.References.Count)
' Create compilation with args is disordered
Dim comp1 = VisualBasicCompilation.Create("Compilation")
Dim Err = "c:\file_that_does_not_exist"
Dim ref1 = NetFramework.mscorlib
Dim listRef = New List(Of MetadataReference)
' this is NOT testing Roslyn
listRef.Add(ref1)
listRef.Add(ref1)
' Remove with no args
comp1 = comp1.AddReferences(listRef).AddSyntaxTrees(listSyntaxTree).RemoveReferences().RemoveSyntaxTrees()
'should have only added one reference since ref1.Equals(ref1) and Equal references are added only once.
Assert.Equal(1, comp1.References.Count)
Assert.Equal(1, comp1.SyntaxTrees.Length)
End Sub
<WorkItem(713356, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/713356")>
<Fact()>
Public Sub MissedModuleA()
Dim netModule1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="missing1">
<file name="a.vb">
Class C1
End Class
</file>
</compilation>, options:=TestOptions.ReleaseModule)
netModule1.VerifyDiagnostics()
Dim netModule2 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="missing2">
<file name="a.vb">
Class C2
Public Shared Sub M()
Dim a As New C1()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference()}, options:=TestOptions.ReleaseModule)
netModule2.VerifyDiagnostics()
Dim assembly = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="missing">
<file name="a.vb">
Class C3
Public Shared Sub Main(args() As String)
Dim a As New C2()
End Sub
End Class
</file>
</compilation>, references:={netModule2.EmitToImageReference()})
assembly.VerifyDiagnostics(Diagnostic(ERRID.ERR_MissingNetModuleReference).WithArguments("missing1.netmodule"))
assembly = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="MissedModuleA">
<file name="a.vb">
Class C3
Public Shared Sub Main(args() As String)
Dim a As New C2()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference(), netModule2.EmitToImageReference()})
assembly.VerifyDiagnostics()
' ILVerify: Assembly or module not found: missing2
CompileAndVerify(assembly, verify:=Verification.FailsILVerify)
End Sub
<WorkItem(713356, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/713356")>
<Fact()>
Public Sub MissedModuleB_OneError()
Dim netModule1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="a1">
<file name="a.vb">
Class C1
End Class
</file>
</compilation>, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule1)
Dim netModule2 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a2">
<file name="a.vb">
Class C2
Public Shared Sub M()
Dim a As New C1()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference()}, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule2)
Dim netModule3 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a3">
<file name="a.vb">
Class C22
Public Shared Sub M()
Dim a As New C1()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference()}, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule3)
Dim assembly = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a">
<file name="a.vb">
Class C3
Public Shared Sub Main(args() As String)
Dim a As New C2()
Dim b As New C22()
End Sub
End Class
</file>
</compilation>, references:={netModule2.EmitToImageReference(), netModule3.EmitToImageReference()})
CompilationUtils.AssertTheseDiagnostics(assembly,
<errors>
BC37221: Reference to 'a1.netmodule' netmodule missing.
</errors>)
End Sub
<WorkItem(718500, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/718500")>
<WorkItem(716762, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/716762")>
<Fact()>
Public Sub MissedModuleB_NoErrorForUnmanagedModules()
Dim netModule1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="a1">
<file name="a.vb">
Imports System.Runtime.InteropServices
Public Class ClassDLLImports
Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA" (
ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
End Class
</file>
</compilation>, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule1)
Dim assembly = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a">
<file name="a.vb">
Class C3
Public Shared Sub Main(args() As String)
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference(expectedWarnings:={
Diagnostic(ERRID.HDN_UnusedImportStatement, "Imports System.Runtime.InteropServices")})})
assembly.AssertNoDiagnostics()
End Sub
<WorkItem(715872, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/715872")>
<Fact()>
Public Sub MissedModuleC()
Dim netModule1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="a1">
<file name="a.vb">
Class C1
End Class
</file>
</compilation>, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule1)
Dim netModule2 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a1">
<file name="a.vb">
Class C2
Public Shared Sub M()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference()}, options:=TestOptions.ReleaseModule)
CompilationUtils.AssertNoDiagnostics(netModule2)
Dim assembly = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="a">
<file name="a.vb">
Class C3
Public Shared Sub Main(args() As String)
Dim a As New C2()
End Sub
End Class
</file>
</compilation>, references:={netModule1.EmitToImageReference(), netModule2.EmitToImageReference()})
CompilationUtils.AssertTheseDiagnostics(assembly,
<errors>
BC37224: Module 'a1.netmodule' is already defined in this assembly. Each module must have a unique filename.
</errors>)
End Sub
<Fact>
Public Sub MixedRefType()
' Create compilation takes three args
Dim csComp = CS.CSharpCompilation.Create("CompilationVB")
Dim comp = VisualBasicCompilation.Create("Compilation")
' this is NOT right path,
' please don't use VB dll (there is a change to the location in Dev11; you test will fail then)
csComp = csComp.AddReferences(SystemRef)
' Add VB reference to C# compilation
For Each item In csComp.References
comp = comp.AddReferences(item)
comp = comp.ReplaceReference(item, item)
Next
Assert.Equal(1, comp.References.Count)
Dim text1 = "Imports System"
Dim comp1 = VisualBasicCompilation.Create("Test1", {VisualBasicSyntaxTree.ParseText(text1)})
Dim comp2 = VisualBasicCompilation.Create("Test2", {VisualBasicSyntaxTree.ParseText(text1)})
Dim compRef1 = comp1.ToMetadataReference()
Dim compRef2 = comp2.ToMetadataReference()
Dim csCompRef = csComp.ToMetadataReference(embedInteropTypes:=True)
Dim ref1 = NetFramework.mscorlib
Dim ref2 = NetFramework.System
' Add VisualBasicCompilationReference
comp = VisualBasicCompilation.Create("Test1",
{VisualBasicSyntaxTree.ParseText(text1)},
{compRef1, compRef2})
Assert.Equal(2, comp.References.Count)
Assert.Equal(MetadataImageKind.Assembly, comp.References(0).Properties.Kind)
Assert.Contains(compRef1, comp.References)
Assert.Contains(compRef2, comp.References)
Dim smb = comp.GetReferencedAssemblySymbol(compRef1)
Assert.Equal(smb.Kind, SymbolKind.Assembly)
Assert.Equal("Test1", smb.Identity.Name, StringComparer.OrdinalIgnoreCase)
' Mixed reference type
comp = comp.AddReferences(ref1)
Assert.Equal(3, comp.References.Count)
Assert.Contains(ref1, comp.References)
' Replace Compilation reference with Assembly file reference
comp = comp.ReplaceReference(compRef2, ref2)
Assert.Equal(3, comp.References.Count)
Assert.Contains(ref2, comp.References)
' Replace Assembly file reference with Compilation reference
comp = comp.ReplaceReference(ref1, compRef2)
Assert.Equal(3, comp.References.Count)
Assert.Contains(compRef2, comp.References)
Dim modRef1 = ModuleMetadata.CreateFromImage(TestResources.MetadataTests.NetModule01.ModuleCS00).GetReference()
' Add Module file reference
comp = comp.AddReferences(modRef1)
' Not Implemented
'Dim modSmb = comp.GetReferencedModuleSymbol(modRef1)
'Assert.Equal("ModuleCS00.mod", modSmb.Name)
'Assert.Equal(4, comp.References.Count)
'Assert.True(comp.References.Contains(modRef1))
' Get Referenced Assembly Symbol
'smb = comp.GetReferencedAssemblySymbol(reference:=modRef1)
'Assert.Equal(smb.Kind, SymbolKind.Assembly)
'Assert.True(String.Equals(smb.AssemblyName.Name, "Test1", StringComparison.OrdinalIgnoreCase))
' Get Referenced Module Symbol
'Dim moduleSmb = comp.GetReferencedModuleSymbol(reference:=modRef1)
'Assert.Equal(moduleSmb.Kind, SymbolKind.NetModule)
'Assert.True(String.Equals(moduleSmb.Name, "ModuleCS00.mod", StringComparison.OrdinalIgnoreCase))
' Not implemented
' Get Compilation Namespace
'Dim nsSmb = comp.GlobalNamespace
'Dim ns = comp.GetCompilationNamespace(ns:=nsSmb)
'Assert.Equal(ns.Kind, SymbolKind.Namespace)
'Assert.True(String.Equals(ns.Name, "Compilation", StringComparison.OrdinalIgnoreCase))
' Not implemented
' GetCompilationNamespace (Derived Class MergedNamespaceSymbol)
'Dim merged As NamespaceSymbol = MergedNamespaceSymbol.Create(New NamespaceExtent(New MockAssemblySymbol("Merged")), Nothing, Nothing)
'ns = comp.GetCompilationNamespace(ns:=merged)
'Assert.Equal(ns.Kind, SymbolKind.Namespace)
'Assert.True(String.Equals(ns.Name, "Compilation", StringComparison.OrdinalIgnoreCase))
' Not implemented
' GetCompilationNamespace (Derived Class PENamespaceSymbol)
'Dim pensSmb As Metadata.PE.PENamespaceSymbol = CType(nsSmb, Metadata.PE.PENamespaceSymbol)
'ns = comp.GetCompilationNamespace(ns:=pensSmb)
'Assert.Equal(ns.Kind, SymbolKind.Namespace)
'Assert.True(String.Equals(ns.Name, "Compilation", StringComparison.OrdinalIgnoreCase))
' Replace Module file reference with compilation reference
comp = comp.RemoveReferences(compRef1).ReplaceReference(modRef1, compRef1)
Assert.Equal(3, comp.References.Count)
' Check the reference order after replace
Assert.Equal(MetadataImageKind.Assembly, comp.References(2).Properties.Kind)
Assert.Equal(compRef1, comp.References(2))
' Replace compilation Module file reference with Module file reference
comp = comp.ReplaceReference(compRef1, modRef1)
' Check the reference order after replace
Assert.Equal(3, comp.References.Count)
Assert.Equal(MetadataImageKind.Module, comp.References(2).Properties.Kind)
Assert.Equal(modRef1, comp.References(2))
' Add CS compilation ref
Assert.Throws(Of ArgumentException)(Function() comp.AddReferences(csCompRef))
For Each item In comp.References
comp = comp.RemoveReferences(item)
Next
Assert.Equal(0, comp.References.Count)
' Not Implemented
' Dim asmByteRef = MetadataReference.CreateFromImage(New Byte(4) {}, "AssemblyBytesRef1", embedInteropTypes:=True)
'Dim asmObjectRef = New AssemblyObjectReference(assembly:=System.Reflection.Assembly.GetAssembly(GetType(Object)), embedInteropTypes:=True)
'comp = comp.AddReferences(asmByteRef, asmObjectRef)
'Assert.Equal(2, comp.References.Count)
'Assert.Equal(ReferenceKind.AssemblyBytes, comp.References(0).Kind)
'Assert.Equal(ReferenceKind.AssemblyObject, comp.References(1).Kind)
'Assert.Equal(asmByteRef, comp.References(0))
'Assert.Equal(asmObjectRef, comp.References(1))
'Assert.True(comp.References(0).EmbedInteropTypes)
'Assert.True(comp.References(1).EmbedInteropTypes)
End Sub
<Fact>
Public Sub ModuleSuppliedAsAssembly()
Dim comp = VisualBasicCompilation.Create("Compilation", references:={AssemblyMetadata.CreateFromImage(TestResources.MetadataTests.NetModule01.ModuleVB01).GetReference()})
Assert.Equal(comp.GetDiagnostics().First().Code, ERRID.ERR_MetaDataIsNotAssembly)
End Sub
<Fact>
Public Sub AssemblySuppliedAsModule()
Dim comp = VisualBasicCompilation.Create("Compilation", references:={ModuleMetadata.CreateFromImage(Net461.Resources.System).GetReference()})
Assert.Equal(comp.GetDiagnostics().First().Code, ERRID.ERR_MetaDataIsNotModule)
End Sub
'' Get nonexistent Referenced Assembly Symbol
<WorkItem(537637, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537637")>
<Fact>
Public Sub NegReference1()
Dim comp = VisualBasicCompilation.Create("Compilation")
Assert.Null(comp.GetReferencedAssemblySymbol(NetFramework.System))
Dim modRef1 = ModuleMetadata.CreateFromImage(TestResources.MetadataTests.NetModule01.ModuleVB01).GetReference()
Assert.Null(comp.GetReferencedModuleSymbol(modRef1))
End Sub
'' Add already existing item
<WorkItem(537617, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537617")>
<Fact>
Public Sub NegReference2()
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim ref1 = NetFramework.System
Dim ref2 = New TestMetadataReference(fullPath:="c:\a\xml.bms")
Dim ref3 = ref2
Dim ref4 = New TestMetadataReference(fullPath:="c:\aaa.dll")
comp = comp.AddReferences(ref1, ref1)
Assert.Equal(1, comp.References.Count)
Assert.Equal(ref1, comp.References(0))
' Remove non-existing item
Assert.Throws(Of ArgumentException)(Function() comp.RemoveReferences(ref2))
Dim listRef = New List(Of MetadataReference) From {ref1, ref2, ref3, ref4}
comp = comp.AddReferences(listRef).AddReferences(ref2).ReplaceReference(ref2, ref2)
Assert.Equal(3, comp.References.Count)
comp = comp.RemoveReferences(listRef).AddReferences(ref1)
Assert.Equal(1, comp.References.Count)
Assert.Equal(ref1, comp.References(0))
End Sub
'' Add a new invalid item
<WorkItem(537575, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537575")>
<Fact>
Public Sub NegReference3()
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim ref1 = New TestMetadataReference(fullPath:="c:\xml.bms")
Dim ref2 = NetFramework.System
comp = comp.AddReferences(ref1)
Assert.Equal(1, comp.References.Count)
' Replace a non-existing item with another invalid item
Assert.Throws(Of ArgumentException)(Sub()
comp = comp.ReplaceReference(ref2, ref1)
End Sub)
Assert.Equal(1, comp.References.Count)
End Sub
'' Replace a non-existing item with null
<WorkItem(537567, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537567")>
<Fact>
Public Sub NegReference4()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim ref1 = New TestMetadataReference(fullPath:="c:\xml.bms")
Assert.Throws(Of ArgumentException)(
Sub()
comp.ReplaceReference(ref1, Nothing)
End Sub)
' Replace null and the arg order of replace is vise
Assert.Throws(Of ArgumentNullException)(
Sub()
comp.ReplaceReference(newReference:=ref1, oldReference:=Nothing)
End Sub)
End Sub
'' Replace a non-existing item with another valid item
<WorkItem(537566, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537566")>
<Fact>
Public Sub NegReference5()
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim ref1 = NetFramework.mscorlib
Dim ref2 = NetFramework.System
Assert.Throws(Of ArgumentException)(
Sub()
comp = comp.ReplaceReference(ref1, ref2)
End Sub)
Dim s1 = "Imports System.Text"
Dim t1 = Parse(s1)
' Replace a non-existing item with another valid item and disorder the args
Assert.Throws(Of ArgumentException)(Sub()
comp.ReplaceSyntaxTree(newTree:=VisualBasicSyntaxTree.ParseText("Imports System"), oldTree:=t1)
End Sub)
Assert.Equal(0, comp.References.Count)
End Sub
'' Throw exception when add Nothing references
<WorkItem(537618, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537618")>
<Fact>
Public Sub NegReference6()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Assert.Throws(Of ArgumentNullException)(Sub() comp = comp.AddReferences(Nothing))
End Sub
'' Throw exception when remove Nothing references
<WorkItem(537621, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537621")>
<Fact>
Public Sub NegReference7()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim RemoveNothingRefEx = Assert.Throws(Of ArgumentNullException)(Sub() comp = comp.RemoveReferences(Nothing))
End Sub
'' Add already existing item
<WorkItem(537576, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537576")>
<Fact>
Public Sub NegSyntaxTree1()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim t1 = VisualBasicSyntaxTree.ParseText("Using System;")
Assert.Throws(Of ArgumentException)(Sub() comp.AddSyntaxTrees(t1, t1))
Assert.Equal(0, comp.SyntaxTrees.Length)
End Sub
' Throw exception when the parameter of ContainsSyntaxTrees is null
<WorkItem(527256, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527256")>
<Fact>
Public Sub NegContainsSyntaxTrees()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Assert.False(comp.SyntaxTrees.Contains(Nothing))
End Sub
' Throw exception when the parameter of AddReferences is CSharpCompilationReference
<WorkItem(537778, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537778")>
<Fact>
Public Sub NegGetSymbol()
Dim opt = TestOptions.ReleaseExe
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim csComp = CS.CSharpCompilation.Create("CompilationCS")
Dim compRef = csComp.ToMetadataReference()
Assert.Throws(Of ArgumentException)(Function() comp.AddReferences(compRef))
'' Throw exception when the parameter of GetReferencedAssemblySymbol is null
'Assert.Throws(Of ArgumentNullException)(Sub() comp.GetReferencedAssemblySymbol(Nothing))
'' Throw exception when the parameter of GetReferencedModuleSymbol is null
'Assert.Throws(Of ArgumentNullException)(
' Sub()
' comp.GetReferencedModuleSymbol(Nothing)
' End Sub)
End Sub
'' Throw exception when the parameter of GetSpecialType is 'SpecialType.None'
<WorkItem(537784, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537784")>
<Fact>
Public Sub NegGetSpecialType()
Dim comp = VisualBasicCompilation.Create("Compilation")
Assert.Throws(Of ArgumentOutOfRangeException)(
Sub()
comp.GetSpecialType((SpecialType.None))
End Sub)
' Throw exception when the parameter of GetSpecialType is '0'
Assert.Throws(Of ArgumentOutOfRangeException)(
Sub()
comp.GetSpecialType(CType(0, SpecialType))
End Sub)
' Throw exception when the parameter of GetBinding is out of range
Assert.Throws(Of ArgumentOutOfRangeException)(
Sub()
comp.GetSpecialType(CType(100, SpecialType))
End Sub)
' Throw exception when the parameter of GetCompilationNamespace is null
Assert.Throws(Of ArgumentNullException)(
Sub()
comp.GetCompilationNamespace(namespaceSymbol:=Nothing)
End Sub)
Dim bind = comp.GetSemanticModel(Nothing)
Assert.NotNull(bind)
End Sub
<Fact>
Public Sub NegSynTree()
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim s1 = "Imports System.Text"
Dim tree = VisualBasicSyntaxTree.ParseText(s1)
' Throw exception when add Nothing SyntaxTree
Assert.Throws(Of ArgumentNullException)(Sub() comp.AddSyntaxTrees(Nothing))
' Throw exception when Remove Nothing SyntaxTree
Assert.Throws(Of ArgumentNullException)(Sub() comp.RemoveSyntaxTrees(Nothing))
' Replace a tree with nothing (aka removing it)
comp = comp.AddSyntaxTrees(tree).ReplaceSyntaxTree(tree, Nothing)
Assert.Equal(0, comp.SyntaxTrees.Count)
' Throw exception when remove Nothing SyntaxTree
Assert.Throws(Of ArgumentNullException)(Sub() comp = comp.ReplaceSyntaxTree(Nothing, tree))
Dim t1 = CS.SyntaxFactory.ParseSyntaxTree(s1)
Dim t2 As SyntaxTree = t1
Dim t3 = t2
Dim csComp = CS.CSharpCompilation.Create("CompilationVB")
csComp = csComp.AddSyntaxTrees(t1, CS.SyntaxFactory.ParseSyntaxTree("Imports Goo"))
' Throw exception when cast SyntaxTree
For Each item In csComp.SyntaxTrees
t3 = item
Dim invalidCastSynTreeEx = Assert.Throws(Of InvalidCastException)(Sub() comp = comp.AddSyntaxTrees(CType(t3, VisualBasicSyntaxTree)))
invalidCastSynTreeEx = Assert.Throws(Of InvalidCastException)(Sub() comp = comp.RemoveSyntaxTrees(CType(t3, VisualBasicSyntaxTree)))
invalidCastSynTreeEx = Assert.Throws(Of InvalidCastException)(Sub() comp = comp.ReplaceSyntaxTree(CType(t3, VisualBasicSyntaxTree), CType(t3, VisualBasicSyntaxTree)))
Next
End Sub
<Fact>
Public Sub RootNSIllegalIdentifiers()
AssertTheseDiagnostics(TestOptions.ReleaseExe.WithRootNamespace("[[Global]]").Errors,
<expected>
BC2014: the value '[[Global]]' is invalid for option 'RootNamespace'
</expected>)
AssertTheseDiagnostics(TestOptions.ReleaseExe.WithRootNamespace("From()").Errors,
<expected>
BC2014: the value 'From()' is invalid for option 'RootNamespace'
</expected>)
AssertTheseDiagnostics(TestOptions.ReleaseExe.WithRootNamespace("x$").Errors,
<expected>
BC2014: the value 'x$' is invalid for option 'RootNamespace'
</expected>)
AssertTheseDiagnostics(TestOptions.ReleaseExe.WithRootNamespace("Goo.").Errors,
<expected>
BC2014: the value 'Goo.' is invalid for option 'RootNamespace'
</expected>)
AssertTheseDiagnostics(TestOptions.ReleaseExe.WithRootNamespace("_").Errors,
<expected>
BC2014: the value '_' is invalid for option 'RootNamespace'
</expected>)
End Sub
<Fact>
Public Sub AmbiguousNestedTypeSymbolFromMetadata()
Dim code = "Class A : Class B : End Class : End Class"
Dim c1 = VisualBasicCompilation.Create("Asm1", syntaxTrees:={VisualBasicSyntaxTree.ParseText(code)})
Dim c2 = VisualBasicCompilation.Create("Asm2", syntaxTrees:={VisualBasicSyntaxTree.ParseText(code)})
Dim c3 = VisualBasicCompilation.Create("Asm3", references:={c1.ToMetadataReference(), c2.ToMetadataReference()})
Assert.Null(c3.GetTypeByMetadataName("A+B"))
End Sub
<Fact>
Public Sub DuplicateNestedTypeSymbol()
Dim code = "Class A : Class B : End Class : Class B : End Class : End Class"
Dim c1 = VisualBasicCompilation.Create("Asm1",
syntaxTrees:={VisualBasicSyntaxTree.ParseText(code)})
Assert.Equal("A.B", c1.GetTypeByMetadataName("A+B").ToDisplayString())
End Sub
<Fact()>
<WorkItem(543211, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543211")>
Public Sub TreeDiagnosticsShouldNotIncludeEntryPointDiagnostics()
Dim code1 = "Module M : Sub Main : End Sub : End Module"
Dim code2 = " "
Dim tree1 = VisualBasicSyntaxTree.ParseText(code1)
Dim tree2 = VisualBasicSyntaxTree.ParseText(code2)
Dim comp = VisualBasicCompilation.Create(
"Test",
syntaxTrees:={tree1, tree2})
Dim semanticModel2 = comp.GetSemanticModel(tree2)
Dim diagnostics2 = semanticModel2.GetDiagnostics()
Assert.Equal(0, diagnostics2.Length())
End Sub
<Fact()>
<WorkItem(543292, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543292")>
Public Sub CompilationNotSupported()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Assert.Throws(Of NotSupportedException)(Function() compilation.DynamicType)
Assert.Throws(Of NotSupportedException)(Function() compilation.CreatePointerTypeSymbol(Nothing))
Assert.Throws(Of NotSupportedException)(Function() compilation.CreateFunctionPointerTypeSymbol(Nothing, Nothing, Nothing, Nothing, Nothing, Nothing))
End Sub
<Fact>
Public Sub CreateTupleTypeSymbol_NoNames()
Dim comp = VisualBasicCompilation.Create("test", references:={MscorlibRef}) ' no ValueTuple
Dim intType As TypeSymbol = comp.GetSpecialType(SpecialType.System_Int32)
Dim stringType As TypeSymbol = comp.GetSpecialType(SpecialType.System_String)
Dim vt2 = comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).Construct(intType, stringType)
Dim tupleWithoutNames = comp.CreateTupleTypeSymbol(vt2, Nothing)
Assert.True(tupleWithoutNames.IsTupleType)
Assert.Equal("(System.Int32, System.String)", tupleWithoutNames.ToTestDisplayString())
Assert.True(tupleWithoutNames.TupleElements.All(Function(e) e.IsImplicitlyDeclared))
Assert.Equal({"System.Int32", "System.String"}, tupleWithoutNames.TupleElements.Select(Function(t) t.Type.ToTestDisplayString()))
Assert.Equal(CInt(SymbolKind.NamedType), CInt(tupleWithoutNames.Kind))
End Sub
<Fact>
Public Sub CreateTupleTypeSymbol_WithNames()
Dim comp = VisualBasicCompilation.Create("test", references:={MscorlibRef}) ' no ValueTuple
Dim intType As TypeSymbol = comp.GetSpecialType(SpecialType.System_Int32)
Dim stringType As TypeSymbol = comp.GetSpecialType(SpecialType.System_String)
Dim vt2 = comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).Construct(intType, stringType)
Dim tupleWithNames = comp.CreateTupleTypeSymbol(vt2, ImmutableArray.Create("Alice", "Bob"))
Assert.True(tupleWithNames.IsTupleType)
Assert.Equal("(Alice As System.Int32, Bob As System.String)", tupleWithNames.ToTestDisplayString())
Assert.Equal({"Alice", "Bob"}, tupleWithNames.TupleElements.SelectAsArray(Function(e) e.Name))
Assert.Equal({"System.Int32", "System.String"}, tupleWithNames.TupleElements.Select(Function(t) t.Type.ToTestDisplayString()))
Assert.Equal(SymbolKind.NamedType, tupleWithNames.Kind)
End Sub
<Fact()>
<WorkItem(36047, "https://github.com/dotnet/roslyn/issues/36047")>
Public Sub CreateArrayType_DefaultArgs()
Dim comp = DirectCast(VisualBasicCompilation.Create(""), Compilation)
Dim elementType = comp.GetSpecialType(SpecialType.System_Object)
Dim arrayType = comp.CreateArrayTypeSymbol(elementType)
Assert.Equal(1, arrayType.Rank)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, arrayType.ElementNullableAnnotation)
Assert.Throws(Of ArgumentException)(Function() comp.CreateArrayTypeSymbol(elementType, Nothing))
Assert.Throws(Of ArgumentException)(Function() comp.CreateArrayTypeSymbol(elementType, 0))
arrayType = comp.CreateArrayTypeSymbol(elementType, 1, Nothing)
Assert.Equal(1, arrayType.Rank)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, arrayType.ElementNullableAnnotation)
Assert.Throws(Of ArgumentException)(Function() comp.CreateArrayTypeSymbol(elementType, rank:=Nothing))
Assert.Throws(Of ArgumentException)(Function() comp.CreateArrayTypeSymbol(elementType, rank:=0))
arrayType = comp.CreateArrayTypeSymbol(elementType, elementNullableAnnotation:=Nothing)
Assert.Equal(1, arrayType.Rank)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, arrayType.ElementNullableAnnotation)
End Sub
<Fact()>
<WorkItem(36047, "https://github.com/dotnet/roslyn/issues/36047")>
Public Sub CreateArrayType_ElementNullableAnnotation()
Dim comp = DirectCast(VisualBasicCompilation.Create(""), Compilation)
Dim elementType = comp.GetSpecialType(SpecialType.System_Object)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, comp.CreateArrayTypeSymbol(elementType).ElementNullableAnnotation)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, comp.CreateArrayTypeSymbol(elementType, elementNullableAnnotation:=Nothing).ElementNullableAnnotation)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, comp.CreateArrayTypeSymbol(elementType, elementNullableAnnotation:=CodeAnalysis.NullableAnnotation.None).ElementNullableAnnotation)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, comp.CreateArrayTypeSymbol(elementType, elementNullableAnnotation:=CodeAnalysis.NullableAnnotation.NotAnnotated).ElementNullableAnnotation)
Assert.Equal(CodeAnalysis.NullableAnnotation.None, comp.CreateArrayTypeSymbol(elementType, elementNullableAnnotation:=CodeAnalysis.NullableAnnotation.Annotated).ElementNullableAnnotation)
End Sub
<Fact()>
Public Sub CreateAnonymousType_IncorrectLengths()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Assert.Throws(Of ArgumentException)(
Function()
Return compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(Nothing, ITypeSymbol)),
ImmutableArray.Create("m1", "m2"))
End Function)
End Sub
<Fact>
Public Sub CreateAnonymousType_IncorrectLengths_IsReadOnly()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Assert.Throws(Of ArgumentException)(
Sub()
compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol),
DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol)),
ImmutableArray.Create("m1", "m2"),
ImmutableArray.Create(True))
End Sub)
End Sub
<Fact>
Public Sub CreateAnonymousType_IncorrectLengths_Locations()
Dim Compilation = VisualBasicCompilation.Create("HelloWorld")
Assert.Throws(Of ArgumentException)(
Sub()
Compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(Compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol),
DirectCast(Compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol)),
ImmutableArray.Create("m1", "m2"),
memberLocations:=ImmutableArray.Create(Location.None))
End Sub)
End Sub
<Fact>
Public Sub CreateAnonymousType_WritableProperty()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Dim type = compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol),
DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol)),
ImmutableArray.Create("m1", "m2"),
ImmutableArray.Create(False, False))
Assert.True(type.IsAnonymousType)
Assert.Equal(2, type.GetMembers().OfType(Of IPropertySymbol).Count())
Assert.Equal("<anonymous type: m1 As Integer, m2 As Integer>", type.ToDisplayString())
Assert.All(type.GetMembers().OfType(Of IPropertySymbol)().Select(Function(p) p.Locations.FirstOrDefault()),
Sub(loc) Assert.Equal(loc, Location.None))
End Sub
<Fact>
Public Sub CreateAnonymousType_Locations()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Dim tree = VisualBasicSyntaxTree.ParseText("Class X")
compilation = compilation.AddSyntaxTrees(tree)
Dim loc1 = Location.Create(tree, New TextSpan(0, 1))
Dim loc2 = Location.Create(tree, New TextSpan(1, 1))
Dim type = compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol),
DirectCast(compilation.GetSpecialType(SpecialType.System_Int32), ITypeSymbol)),
ImmutableArray.Create("m1", "m2"),
ImmutableArray.Create(False, False),
ImmutableArray.Create(loc1, loc2))
Assert.True(type.IsAnonymousType)
Assert.Equal(2, type.GetMembers().OfType(Of IPropertySymbol).Count())
Assert.Equal(loc1, type.GetMembers("m1").Single().Locations.Single())
Assert.Equal(loc2, type.GetMembers("m2").Single().Locations.Single())
Assert.Equal("<anonymous type: m1 As Integer, m2 As Integer>", type.ToDisplayString())
End Sub
<Fact()>
Public Sub CreateAnonymousType_NothingArgument()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Assert.Throws(Of ArgumentNullException)(
Function()
Return compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(DirectCast(Nothing, ITypeSymbol)),
ImmutableArray.Create("m1"))
End Function)
End Sub
<Fact()>
Public Sub CreateAnonymousType1()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Dim type = compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(Of ITypeSymbol)(compilation.GetSpecialType(SpecialType.System_Int32)),
ImmutableArray.Create("m1"))
Assert.True(type.IsAnonymousType)
Assert.Equal(1, type.GetMembers().OfType(Of IPropertySymbol).Count())
Assert.Equal("<anonymous type: Key m1 As Integer>", type.ToDisplayString())
Assert.All(type.GetMembers().OfType(Of IPropertySymbol)().Select(Function(p) p.Locations.FirstOrDefault()),
Sub(loc) Assert.Equal(loc, Location.None))
End Sub
<Fact()>
Public Sub CreateMutableAnonymousType1()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Dim type = compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(Of ITypeSymbol)(compilation.GetSpecialType(SpecialType.System_Int32)),
ImmutableArray.Create("m1"),
ImmutableArray.Create(False))
Assert.True(type.IsAnonymousType)
Assert.Equal(1, type.GetMembers().OfType(Of IPropertySymbol).Count())
Assert.Equal("<anonymous type: m1 As Integer>", type.ToDisplayString())
Assert.All(type.GetMembers().OfType(Of IPropertySymbol)().Select(Function(p) p.Locations.FirstOrDefault()),
Sub(loc) Assert.Equal(loc, Location.None))
End Sub
<Fact()>
Public Sub CreateAnonymousType2()
Dim compilation = VisualBasicCompilation.Create("HelloWorld")
Dim type = compilation.CreateAnonymousTypeSymbol(
ImmutableArray.Create(Of ITypeSymbol)(compilation.GetSpecialType(SpecialType.System_Int32), compilation.GetSpecialType(SpecialType.System_Boolean)),
ImmutableArray.Create("m1", "m2"))
Assert.True(type.IsAnonymousType)
Assert.Equal(2, type.GetMembers().OfType(Of IPropertySymbol).Count())
Assert.Equal("<anonymous type: Key m1 As Integer, Key m2 As Boolean>", type.ToDisplayString())
Assert.All(type.GetMembers().OfType(Of IPropertySymbol)().Select(Function(p) p.Locations.FirstOrDefault()),
Sub(loc) Assert.Equal(loc, Location.None))
End Sub
<Fact()>
<WorkItem(36047, "https://github.com/dotnet/roslyn/issues/36047")>
Public Sub CreateAnonymousType_DefaultArgs()
Dim comp = DirectCast(CreateCompilation(""), Compilation)
Dim memberTypes = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Dim memberNames = ImmutableArray.Create("P", "Q")
Dim type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, Nothing, Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, Nothing, Nothing, Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, memberIsReadOnly:=Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, memberLocations:=Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, memberNullableAnnotations:=Nothing)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
End Sub
<Fact()>
<WorkItem(36047, "https://github.com/dotnet/roslyn/issues/36047")>
Public Sub CreateAnonymousType_MemberNullableAnnotations_Empty()
Dim comp = DirectCast(VisualBasicCompilation.Create(""), Compilation)
Dim type = comp.CreateAnonymousTypeSymbol(ImmutableArray(Of ITypeSymbol).Empty, ImmutableArray(Of String).Empty, memberNullableAnnotations:=ImmutableArray(Of CodeAnalysis.NullableAnnotation).Empty)
Assert.Equal("<empty anonymous type>", type.ToTestDisplayString())
AssertEx.Equal(Array.Empty(Of CodeAnalysis.NullableAnnotation)(), GetAnonymousTypeNullableAnnotations(type))
End Sub
<Fact()>
<WorkItem(36047, "https://github.com/dotnet/roslyn/issues/36047")>
Public Sub CreateAnonymousType_MemberNullableAnnotations()
Dim comp = DirectCast(CreateCompilation(""), Compilation)
Dim memberTypes = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Dim memberNames = ImmutableArray.Create("P", "Q")
Dim type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames)
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, GetAnonymousTypeNullableAnnotations(type))
Assert.Throws(Of ArgumentException)(Function() comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, memberNullableAnnotations:=ImmutableArray.Create(CodeAnalysis.NullableAnnotation.NotAnnotated)))
type = comp.CreateAnonymousTypeSymbol(memberTypes, memberNames, memberNullableAnnotations:=ImmutableArray.Create(CodeAnalysis.NullableAnnotation.NotAnnotated, CodeAnalysis.NullableAnnotation.Annotated))
Assert.Equal("<anonymous type: Key P As System.Object, Key Q As System.String>", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, GetAnonymousTypeNullableAnnotations(type))
End Sub
Private Shared Function GetAnonymousTypeNullableAnnotations(type As ITypeSymbol) As ImmutableArray(Of CodeAnalysis.NullableAnnotation)
Return type.GetMembers().OfType(Of IPropertySymbol)().SelectAsArray(Function(p) p.NullableAnnotation)
End Function
<Theory>
<InlineData(WellKnownMemberNames.AdditionOperatorName, "Public Shared Operator +(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.SubtractionOperatorName, "Public Shared Operator -(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.MultiplyOperatorName, "Public Shared Operator *(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.ModulusOperatorName, "Public Shared Operator Mod(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.IntegerDivisionOperatorName, "Public Shared Operator \(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.LeftShiftOperatorName, "Public Shared Operator <<(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.RightShiftOperatorName, "Public Shared Operator >>(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.ExclusiveOrOperatorName, "Public Shared Operator Xor(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.BitwiseOrOperatorName, "Public Shared Operator Or(left As Integer, right As Integer) As Integer")>
<InlineData(WellKnownMemberNames.BitwiseAndOperatorName, "Public Shared Operator And(left As Integer, right As Integer) As Integer")>
Public Sub CreateBuiltinBinaryOperator_Supported(name As String, display As String)
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim op = compilation.CreateBuiltinOperator(name, intType, intType, intType)
Dim result = op.ToDisplayString()
AssertEx.Equal(display, result)
End Sub
<Theory>
<InlineData(WellKnownMemberNames.EqualityOperatorName, "Public Shared Operator =(left As Integer, right As Integer) As Boolean")>
<InlineData(WellKnownMemberNames.InequalityOperatorName, "Public Shared Operator <>(left As Integer, right As Integer) As Boolean")>
<InlineData(WellKnownMemberNames.LessThanOrEqualOperatorName, "Public Shared Operator <=(left As Integer, right As Integer) As Boolean")>
<InlineData(WellKnownMemberNames.GreaterThanOrEqualOperatorName, "Public Shared Operator >=(left As Integer, right As Integer) As Boolean")>
<InlineData(WellKnownMemberNames.LessThanOperatorName, "Public Shared Operator <(left As Integer, right As Integer) As Boolean")>
<InlineData(WellKnownMemberNames.GreaterThanOperatorName, "Public Shared Operator >(left As Integer, right As Integer) As Boolean")>
Public Sub CreateBuiltinBinaryOperator_Supported_Bool(name As String, display As String)
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim boolType = compilation.GetSpecialType(SpecialType.System_Boolean)
Dim op = compilation.CreateBuiltinOperator(name, boolType, intType, intType)
Dim result = op.ToDisplayString()
AssertEx.Equal(display, result)
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_Supported_Concatenate()
Dim compilation = CreateCompilation("")
Dim stringType = compilation.GetSpecialType(SpecialType.System_String)
Dim op = compilation.CreateBuiltinOperator(WellKnownMemberNames.ConcatenateOperatorName, stringType, stringType, stringType)
Dim result = op.ToDisplayString()
AssertEx.Equal("Public Shared Operator &(left As String, right As String) As String", result)
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_Supported_Like()
Dim compilation = CreateCompilation("")
Dim stringType = compilation.GetSpecialType(SpecialType.System_String)
Dim boolType = compilation.GetSpecialType(SpecialType.System_Boolean)
Dim op = compilation.CreateBuiltinOperator(WellKnownMemberNames.LikeOperatorName, boolType, stringType, stringType)
Dim result = op.ToDisplayString()
AssertEx.Equal("Public Shared Operator Like(left As String, right As String) As Boolean", result)
End Sub
<Theory>
<InlineData(WellKnownMemberNames.DivisionOperatorName, "Public Shared Operator /(left As Double, right As Double) As Double")>
<InlineData(WellKnownMemberNames.ExponentOperatorName, "Public Shared Operator ^(left As Double, right As Double) As Double")>
Public Sub CreateBuiltinBinaryOperator_Supported_Double(name As String, display As String)
Dim compilation = CreateCompilation("")
Dim doubleType = compilation.GetSpecialType(SpecialType.System_Double)
Dim op = compilation.CreateBuiltinOperator(name, doubleType, doubleType, doubleType)
Dim result = op.ToDisplayString()
AssertEx.Equal(display, result)
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_BogusErrorType()
Dim compilation = CreateCompilation("")
Dim fakeIntType = compilation.CreateErrorTypeSymbol(compilation.CreateErrorNamespaceSymbol(compilation.GlobalNamespace, "System"), "Int32", arity:=0)
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, fakeIntType, fakeIntType, fakeIntType))
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_RealErrorType()
Dim compilation = CreateCompilation("", references:={}, targetFramework:=TargetFramework.Empty)
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim op = compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, intType, intType, intType)
Dim result = op.ToDisplayString()
AssertEx.Equal("Public Shared Operator +(left As Integer, right As Integer) As Integer", result)
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_NotSupported()
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim nullableIntType = compilation.GetSpecialType(SpecialType.System_Nullable_T).Construct(intType)
' c# binary operator name
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.IncrementOperatorName, intType, intType, intType))
' unary operator name
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, intType, intType, intType))
' nullable type 1
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, nullableIntType, intType, intType))
' nullable type 2
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, intType, nullableIntType, intType))
' nullable type 3
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, intType, intType, nullableIntType))
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_NullChecks()
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Assert.Throws(Of ArgumentNullException)("returnType", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, Nothing, intType, intType))
Assert.Throws(Of ArgumentNullException)("leftType", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, intType, Nothing, intType))
Assert.Throws(Of ArgumentNullException)("rightType", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, intType, intType, Nothing))
End Sub
<Theory>
<InlineData(WellKnownMemberNames.UnaryPlusOperatorName, "Public Shared Operator +(value As Integer) As Integer")>
<InlineData(WellKnownMemberNames.UnaryNegationOperatorName, "Public Shared Operator -(value As Integer) As Integer")>
<InlineData(WellKnownMemberNames.OnesComplementOperatorName, "Public Shared Operator Not(value As Integer) As Integer")>
Public Sub CreateBuiltinUnaryOperator_Supported(name As String, display As String)
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim op = compilation.CreateBuiltinOperator(name, intType, intType)
Dim result = op.ToDisplayString()
AssertEx.Equal(display, result)
End Sub
<Fact>
Public Sub CreateBuiltinUnaryOperator_NotSupported()
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim nullableIntType = compilation.GetSpecialType(SpecialType.System_Nullable_T).Construct(intType)
' Binary operator name
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, intType, intType))
' Nullable type 1
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, nullableIntType, intType))
' Nullable type 2
Assert.Throws(Of ArgumentException)("name", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.AdditionOperatorName, intType, nullableIntType))
' op_Implicit
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.ImplicitConversionName, intType, intType))
' op_Explicit
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.ExplicitConversionName, intType, intType))
' op_False
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.FalseOperatorName, intType, intType))
' op_True
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.TrueOperatorName, intType, intType))
End Sub
<Fact>
Public Sub CreateBuiltinUnaryOperator_BogusErrorType()
Dim compilation = CreateCompilation("")
Dim fakeIntType = compilation.CreateErrorTypeSymbol(compilation.CreateErrorNamespaceSymbol(compilation.GlobalNamespace, "System"), "Int32", arity:=0)
Assert.Throws(Of ArgumentException)(Nothing, Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, fakeIntType, fakeIntType))
End Sub
<Fact>
Public Sub CreateBuiltinUnaryOperator_RealErrorType()
Dim compilation = CreateCompilation("", references:={}, targetFramework:=TargetFramework.Empty)
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Dim op = compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, intType, intType)
Dim result = op.ToDisplayString()
AssertEx.Equal("Public Shared Operator +(value As Integer) As Integer", result)
End Sub
<Fact>
Public Sub CreateBuiltinUnaryOperator_NullChecks()
Dim compilation = CreateCompilation("")
Dim intType = compilation.GetSpecialType(SpecialType.System_Int32)
Assert.Throws(Of ArgumentNullException)("returnType", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, Nothing, intType))
Assert.Throws(Of ArgumentNullException)("operandType", Function() compilation.CreateBuiltinOperator(WellKnownMemberNames.UnaryPlusOperatorName, intType, Nothing))
End Sub
<Fact>
Public Sub CreateBuiltinBinaryOperator_CompareToActualSymbols1()
Dim Compilation = CreateCompilation("
class C
sub M()
dim m = 1 + 1 'BIND:""1 + 1""
end sub
end class")
Dim intType = Compilation.GetSpecialType(SpecialType.System_Int32)
Dim SyntaxTree = Compilation.SyntaxTrees.Single()
Dim SemanticModel = Compilation.GetSemanticModel(SyntaxTree)
Dim expr = FindBindingText(Of BinaryExpressionSyntax)(Compilation)
Dim Symbol = SemanticModel.GetSymbolInfo(expr).Symbol
Assert.NotNull(Symbol)
Dim subtractBuiltIn = Compilation.CreateBuiltinOperator(WellKnownMemberNames.SubtractionOperatorName, intType, intType, intType)
Dim subtractBuiltInChecked = Compilation.CreateBuiltinOperator(WellKnownMemberNames.CheckedSubtractionOperatorName, intType, intType, intType)
Assert.NotEqual(subtractBuiltIn, Symbol)
Assert.NotEqual(subtractBuiltInChecked, Symbol)
End Sub
<Fact()>
<WorkItem(36046, "https://github.com/dotnet/roslyn/issues/36046")>
Public Sub ConstructTypeWithNullability()
Dim source =
"Class Pair(Of T, U)
End Class"
Dim comp = DirectCast(CreateCompilation(source), Compilation)
Dim genericType = DirectCast(comp.GetMember("Pair"), INamedTypeSymbol)
Dim typeArguments = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Assert.Throws(Of ArgumentException)(Function() genericType.Construct(New ImmutableArray(Of ITypeSymbol), New ImmutableArray(Of CodeAnalysis.NullableAnnotation)))
Assert.Throws(Of ArgumentException)(Function() genericType.Construct(typeArguments:=Nothing, typeArgumentNullableAnnotations:=Nothing))
Dim type = genericType.Construct(typeArguments, Nothing)
Assert.Equal("Pair(Of System.Object, System.String)", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, type.TypeArgumentNullableAnnotations)
Assert.Throws(Of ArgumentException)(Function() genericType.Construct(typeArguments, ImmutableArray(Of CodeAnalysis.NullableAnnotation).Empty))
Assert.Throws(Of ArgumentException)(Function() genericType.Construct(ImmutableArray.Create(Of ITypeSymbol)(Nothing, Nothing), Nothing))
type = genericType.Construct(typeArguments, ImmutableArray.Create(CodeAnalysis.NullableAnnotation.Annotated, CodeAnalysis.NullableAnnotation.NotAnnotated))
Assert.Equal("Pair(Of System.Object, System.String)", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, type.TypeArgumentNullableAnnotations)
' Type arguments from C#.
comp = CreateCSharpCompilation("")
typeArguments = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Assert.Throws(Of ArgumentException)(Function() genericType.Construct(typeArguments, Nothing))
End Sub
<Fact()>
<WorkItem(37310, "https://github.com/dotnet/roslyn/issues/37310")>
Public Sub ConstructMethodWithNullability()
Dim source =
"Class Program
Shared Sub M(Of T, U)
End Sub
End Class"
Dim comp = DirectCast(CreateCompilation(source), Compilation)
Dim genericMethod = DirectCast(comp.GetMember("Program.M"), IMethodSymbol)
Dim typeArguments = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Assert.Throws(Of ArgumentException)(Function() genericMethod.Construct(New ImmutableArray(Of ITypeSymbol), New ImmutableArray(Of CodeAnalysis.NullableAnnotation)))
Assert.Throws(Of ArgumentException)(Function() genericMethod.Construct(typeArguments:=Nothing, typeArgumentNullableAnnotations:=Nothing))
Dim type = genericMethod.Construct(typeArguments, Nothing)
Assert.Equal("Sub Program.M(Of System.Object, System.String)()", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, type.TypeArgumentNullableAnnotations)
Assert.Throws(Of ArgumentException)(Function() genericMethod.Construct(typeArguments, ImmutableArray(Of CodeAnalysis.NullableAnnotation).Empty))
Assert.Throws(Of ArgumentException)(Function() genericMethod.Construct(ImmutableArray.Create(Of ITypeSymbol)(Nothing, Nothing), Nothing))
type = genericMethod.Construct(typeArguments, ImmutableArray.Create(CodeAnalysis.NullableAnnotation.Annotated, CodeAnalysis.NullableAnnotation.NotAnnotated))
Assert.Equal("Sub Program.M(Of System.Object, System.String)()", type.ToTestDisplayString())
AssertEx.Equal({CodeAnalysis.NullableAnnotation.None, CodeAnalysis.NullableAnnotation.None}, type.TypeArgumentNullableAnnotations)
' Type arguments from C#.
comp = CreateCSharpCompilation("")
typeArguments = ImmutableArray.Create(Of ITypeSymbol)(comp.GetSpecialType(SpecialType.System_Object), comp.GetSpecialType(SpecialType.System_String))
Assert.Throws(Of ArgumentException)(Function() genericMethod.Construct(typeArguments, Nothing))
End Sub
<Fact()>
Public Sub GetEntryPoint_Exe()
Dim source = <compilation name="Name1">
<file name="a.vb"><![CDATA[
Class A
Shared Sub Main()
End Sub
End Class
]]>
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40(source, OutputKind.ConsoleApplication)
compilation.VerifyDiagnostics()
Dim mainMethod = compilation.GlobalNamespace.GetMember(Of NamedTypeSymbol)("A").GetMember(Of MethodSymbol)("Main")
Assert.Equal(mainMethod, compilation.GetEntryPoint(Nothing))
Dim entryPointAndDiagnostics = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(mainMethod, entryPointAndDiagnostics.MethodSymbol)
entryPointAndDiagnostics.Diagnostics.Verify()
End Sub
<Fact()>
Public Sub GetEntryPoint_Dll()
Dim source = <compilation name="Name1">
<file name="a.vb"><![CDATA[
Class A
Shared Sub Main()
End Sub
End Class
]]>
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40(source, OutputKind.DynamicallyLinkedLibrary)
compilation.VerifyDiagnostics()
Assert.Null(compilation.GetEntryPoint(Nothing))
Assert.Null(compilation.GetEntryPointAndDiagnostics(Nothing))
End Sub
<Fact()>
Public Sub GetEntryPoint_Module()
Dim source = <compilation name="Name1">
<file name="a.vb"><![CDATA[
Class A
Shared Sub Main()
End Sub
End Class
]]>
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40(source, OutputKind.NetModule)
compilation.VerifyDiagnostics()
Assert.Null(compilation.GetEntryPoint(Nothing))
Assert.Null(compilation.GetEntryPointAndDiagnostics(Nothing))
End Sub
<Fact>
Public Sub CreateCompilationForModule()
Dim source =
<text>
Class A
Shared Sub Main()
End Sub
End Class
</text>.Value
' equivalent of vbc with no /moduleassemblyname specified:
Dim c = VisualBasicCompilation.Create(assemblyName:=Nothing, options:=TestOptions.ReleaseModule, syntaxTrees:={Parse(source)}, references:={MscorlibRef})
c.VerifyEmitDiagnostics()
Assert.Null(c.AssemblyName)
Assert.Equal("?", c.Assembly.Name)
Assert.Equal("?", c.Assembly.Identity.Name)
' no name is allowed for assembly as well, although it isn't useful:
c = VisualBasicCompilation.Create(assemblyName:=Nothing, options:=TestOptions.ReleaseModule, syntaxTrees:={Parse(source)}, references:={MscorlibRef})
c.VerifyEmitDiagnostics()
Assert.Null(c.AssemblyName)
Assert.Equal("?", c.Assembly.Name)
Assert.Equal("?", c.Assembly.Identity.Name)
' equivalent of vbc with /moduleassemblyname specified:
c = VisualBasicCompilation.Create(assemblyName:="ModuleAssemblyName", options:=TestOptions.ReleaseModule, syntaxTrees:={Parse(source)}, references:={MscorlibRef})
c.VerifyDiagnostics()
Assert.Equal("ModuleAssemblyName", c.AssemblyName)
Assert.Equal("ModuleAssemblyName", c.Assembly.Name)
Assert.Equal("ModuleAssemblyName", c.Assembly.Identity.Name)
End Sub
<WorkItem(8506, "https://github.com/dotnet/roslyn/issues/8506")>
<WorkItem(17403, "https://github.com/dotnet/roslyn/issues/17403")>
<Fact()>
Public Sub CrossCorlibSystemObjectReturnType_Script()
' MinAsyncCorlibRef corlib Is used since it provides just enough corlib type definitions
' And Task APIs necessary for script hosting are provided by MinAsyncRef. This ensures that
' `System.Object, mscorlib, Version=4.0.0.0` will Not be provided (since it's unversioned).
'
' In the original bug, Xamarin iOS, Android, And Mac Mobile profile corlibs were
' realistic cross-compilation targets.
Dim AssertCompilationCorlib As Action(Of VisualBasicCompilation) =
Sub(compilation As VisualBasicCompilation)
Assert.True(compilation.IsSubmission)
Dim taskOfT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T)
Dim taskOfObject = taskOfT.Construct(compilation.ObjectType)
Dim entryPoint = compilation.GetEntryPoint(Nothing)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfT.ContainingAssembly)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfObject.ContainingAssembly)
Assert.Equal(taskOfObject, entryPoint.ReturnType)
End Sub
Dim firstCompilation = VisualBasicCompilation.CreateScriptCompilation(
"submission-assembly-1",
references:={MinAsyncCorlibRef},
syntaxTree:=Parse("? True", options:=TestOptions.Script)
).VerifyDiagnostics()
AssertCompilationCorlib(firstCompilation)
Dim secondCompilation = VisualBasicCompilation.CreateScriptCompilation(
"submission-assembly-2",
previousScriptCompilation:=firstCompilation,
syntaxTree:=Parse("? False", options:=TestOptions.Script)
).WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(firstCompilation, Nothing, Nothing)
).VerifyDiagnostics()
AssertCompilationCorlib(secondCompilation)
Assert.Same(firstCompilation.ObjectType, secondCompilation.ObjectType)
Assert.Null(New VisualBasicScriptCompilationInfo(Nothing, Nothing, Nothing).WithPreviousScriptCompilation(firstCompilation).ReturnTypeOpt)
End Sub
<WorkItem(3719, "https://github.com/dotnet/roslyn/issues/3719")>
<Fact()>
Public Sub GetEntryPoint_Script()
Dim source = <![CDATA[System.Console.WriteLine(1)]]>
Dim compilation = CreateCompilationWithMscorlib461({VisualBasicSyntaxTree.ParseText(source.Value, options:=TestOptions.Script)}, options:=TestOptions.ReleaseDll)
compilation.VerifyDiagnostics()
Dim scriptMethod = compilation.GetMember("Script.<Main>")
Assert.NotNull(scriptMethod)
Dim method = compilation.GetEntryPoint(Nothing)
Assert.Equal(method, scriptMethod)
Dim entryPoint = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(entryPoint.MethodSymbol, scriptMethod)
End Sub
<Fact()>
Public Sub GetEntryPoint_Script_MainIgnored()
Dim source = <![CDATA[
Class A
Shared Sub Main()
End Sub
End Class
]]>
Dim compilation = CreateCompilationWithMscorlib461({VisualBasicSyntaxTree.ParseText(source.Value, options:=TestOptions.Script)}, options:=TestOptions.ReleaseDll)
compilation.VerifyDiagnostics(Diagnostic(ERRID.WRN_MainIgnored, "Main").WithArguments("Public Shared Sub Main()").WithLocation(3, 20))
Dim scriptMethod = compilation.GetMember("Script.<Main>")
Assert.NotNull(scriptMethod)
Dim entryPoint = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(entryPoint.MethodSymbol, scriptMethod)
entryPoint.Diagnostics.Verify(Diagnostic(ERRID.WRN_MainIgnored, "Main").WithArguments("Public Shared Sub Main()").WithLocation(3, 20))
End Sub
<Fact()>
Public Sub GetEntryPoint_Submission()
Dim source = "? 1 + 1"
Dim compilation = VisualBasicCompilation.CreateScriptCompilation(
"sub",
references:={MscorlibRef},
syntaxTree:=Parse(source, options:=TestOptions.Script))
compilation.VerifyDiagnostics()
Dim scriptMethod = compilation.GetMember("Script.<Factory>")
Assert.NotNull(scriptMethod)
Dim method = compilation.GetEntryPoint(Nothing)
Assert.Equal(method, scriptMethod)
Dim entryPoint = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(entryPoint.MethodSymbol, scriptMethod)
entryPoint.Diagnostics.Verify()
End Sub
<Fact()>
Public Sub GetEntryPoint_Submission_MainIgnored()
Dim source = "
Class A
Shared Sub Main()
End Sub
End Class
"
Dim compilation = VisualBasicCompilation.CreateScriptCompilation(
"Sub",
references:={MscorlibRef},
syntaxTree:=Parse(source, options:=TestOptions.Script))
compilation.VerifyDiagnostics(Diagnostic(ERRID.WRN_MainIgnored, "Main").WithArguments("Public Shared Sub Main()").WithLocation(3, 20))
Dim scriptMethod = compilation.GetMember("Script.<Factory>")
Assert.NotNull(scriptMethod)
Dim entryPoint = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(entryPoint.MethodSymbol, scriptMethod)
entryPoint.Diagnostics.Verify(Diagnostic(ERRID.WRN_MainIgnored, "Main").WithArguments("Public Shared Sub Main()").WithLocation(3, 20))
End Sub
<Fact()>
Public Sub GetEntryPoint_MainType()
Dim source = <compilation name="Name1">
<file name="a.vb"><![CDATA[
Class A
Shared Sub Main()
End Sub
End Class
Class B
Shared Sub Main()
End Sub
End Class
]]>
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40(source, options:=TestOptions.ReleaseExe.WithMainTypeName("B"))
compilation.VerifyDiagnostics()
Dim mainMethod = compilation.GlobalNamespace.GetMember(Of NamedTypeSymbol)("B").GetMember(Of MethodSymbol)("Main")
Assert.Equal(mainMethod, compilation.GetEntryPoint(Nothing))
Dim entryPointAndDiagnostics = compilation.GetEntryPointAndDiagnostics(Nothing)
Assert.Equal(mainMethod, entryPointAndDiagnostics.MethodSymbol)
entryPointAndDiagnostics.Diagnostics.Verify()
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithOptions()
Dim c1 = VisualBasicCompilation.Create("c", options:=TestOptions.ReleaseDll)
Dim c2 = c1.WithOptions(TestOptions.ReleaseExe)
Assert.True(c1.ReferenceManagerEquals(c2))
c2 = c1.WithOptions(New VisualBasicCompilationOptions(OutputKind.WindowsApplication))
Assert.True(c1.ReferenceManagerEquals(c2))
c2 = c1.WithOptions(TestOptions.ReleaseModule)
Assert.False(c1.ReferenceManagerEquals(c2))
c1 = VisualBasicCompilation.Create("c", options:=TestOptions.ReleaseModule)
c2 = c1.WithOptions(TestOptions.ReleaseExe)
Assert.False(c1.ReferenceManagerEquals(c2))
c2 = c1.WithOptions(TestOptions.ReleaseDll)
Assert.False(c1.ReferenceManagerEquals(c2))
c2 = c1.WithOptions(New VisualBasicCompilationOptions(OutputKind.WindowsApplication))
Assert.False(c1.ReferenceManagerEquals(c2))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithXmlFileResolver()
Dim c1 = VisualBasicCompilation.Create("c", options:=TestOptions.ReleaseDll)
Dim c2 = c1.WithOptions(TestOptions.ReleaseDll.WithXmlReferenceResolver(New XmlFileResolver(Nothing)))
Assert.False(c1.ReferenceManagerEquals(c2))
Dim c3 = c1.WithOptions(TestOptions.ReleaseDll.WithXmlReferenceResolver(c1.Options.XmlReferenceResolver))
Assert.True(c1.ReferenceManagerEquals(c3))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithMetadataReferenceResolver()
Dim c1 = VisualBasicCompilation.Create("c", options:=TestOptions.ReleaseDll)
Dim c2 = c1.WithOptions(TestOptions.ReleaseDll.WithMetadataReferenceResolver(New TestMetadataReferenceResolver()))
Assert.False(c1.ReferenceManagerEquals(c2))
Dim c3 = c1.WithOptions(TestOptions.ReleaseDll.WithMetadataReferenceResolver(c1.Options.MetadataReferenceResolver))
Assert.True(c1.ReferenceManagerEquals(c3))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithName()
Dim c1 = VisualBasicCompilation.Create("c1")
Dim c2 = c1.WithAssemblyName("c2")
Assert.False(c1.ReferenceManagerEquals(c2))
Dim c3 = c1.WithAssemblyName("c1")
Assert.True(c1.ReferenceManagerEquals(c3))
Dim c4 = c1.WithAssemblyName(Nothing)
Assert.False(c1.ReferenceManagerEquals(c4))
Dim c5 = c4.WithAssemblyName(Nothing)
Assert.True(c4.ReferenceManagerEquals(c5))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithReferences()
Dim c1 = VisualBasicCompilation.Create("c1")
Dim c2 = c1.WithReferences({MscorlibRef})
Assert.False(c1.ReferenceManagerEquals(c2))
Dim c3 = c2.WithReferences({MscorlibRef, SystemCoreRef})
Assert.False(c3.ReferenceManagerEquals(c2))
c3 = c2.AddReferences(SystemCoreRef)
Assert.False(c3.ReferenceManagerEquals(c2))
c3 = c2.RemoveAllReferences()
Assert.False(c3.ReferenceManagerEquals(c2))
c3 = c2.ReplaceReference(MscorlibRef, SystemCoreRef)
Assert.False(c3.ReferenceManagerEquals(c2))
c3 = c2.RemoveReferences(MscorlibRef)
Assert.False(c3.ReferenceManagerEquals(c2))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithSyntaxTrees()
Dim ta = Parse("Imports System")
Dim tb = Parse("Imports System", options:=TestOptions.Script.WithLanguageVersion(LanguageVersion.Latest))
Dim tc = Parse("#r ""bar"" ' error: #r in regular code")
Dim tr = Parse("#r ""goo""", options:=TestOptions.Script.WithLanguageVersion(LanguageVersion.Latest))
Dim ts = Parse("#r ""bar""", options:=TestOptions.Script.WithLanguageVersion(LanguageVersion.Latest))
Dim a = VisualBasicCompilation.Create("c", syntaxTrees:={ta})
' add:
Dim ab = a.AddSyntaxTrees(tb)
Assert.True(a.ReferenceManagerEquals(ab))
Dim ac = a.AddSyntaxTrees(tc)
Assert.True(a.ReferenceManagerEquals(ac))
Dim ar = a.AddSyntaxTrees(tr)
Assert.False(a.ReferenceManagerEquals(ar))
Dim arc = ar.AddSyntaxTrees(tc)
Assert.True(ar.ReferenceManagerEquals(arc))
' remove:
Dim ar2 = arc.RemoveSyntaxTrees(tc)
Assert.True(arc.ReferenceManagerEquals(ar2))
Dim c = arc.RemoveSyntaxTrees(ta, tr)
Assert.False(arc.ReferenceManagerEquals(c))
Dim none1 = c.RemoveSyntaxTrees(tc)
Assert.True(c.ReferenceManagerEquals(none1))
Dim none2 = arc.RemoveAllSyntaxTrees()
Assert.False(arc.ReferenceManagerEquals(none2))
Dim none3 = ac.RemoveAllSyntaxTrees()
Assert.True(ac.ReferenceManagerEquals(none3))
' replace:
Dim asc = arc.ReplaceSyntaxTree(tr, ts)
Assert.False(arc.ReferenceManagerEquals(asc))
Dim brc = arc.ReplaceSyntaxTree(ta, tb)
Assert.True(arc.ReferenceManagerEquals(brc))
Dim abc = arc.ReplaceSyntaxTree(tr, tb)
Assert.False(arc.ReferenceManagerEquals(abc))
Dim ars = arc.ReplaceSyntaxTree(tc, ts)
Assert.False(arc.ReferenceManagerEquals(ars))
End Sub
<Fact>
Public Sub ReferenceManagerReuse_WithScriptCompilationInfo()
' Note The following results would change if we optimized sharing more: https://github.com/dotnet/roslyn/issues/43397
Dim c1 = VisualBasicCompilation.CreateScriptCompilation("c1")
Assert.NotNull(c1.ScriptCompilationInfo)
Assert.Null(c1.ScriptCompilationInfo.PreviousScriptCompilation)
Dim c2 = c1.WithScriptCompilationInfo(Nothing)
Assert.Null(c2.ScriptCompilationInfo)
Assert.True(c2.ReferenceManagerEquals(c1))
Dim c3 = c2.WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(previousCompilationOpt:=Nothing, returnType:=GetType(Integer), globalsType:=Nothing))
Assert.NotNull(c3.ScriptCompilationInfo)
Assert.Null(c3.ScriptCompilationInfo.PreviousScriptCompilation)
Assert.True(c3.ReferenceManagerEquals(c2))
Dim c4 = c3.WithScriptCompilationInfo(Nothing)
Assert.Null(c4.ScriptCompilationInfo)
Assert.True(c4.ReferenceManagerEquals(c3))
Dim c5 = c4.WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(previousCompilationOpt:=c1, returnType:=GetType(Integer), globalsType:=Nothing))
Assert.False(c5.ReferenceManagerEquals(c4))
Dim c6 = c5.WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(previousCompilationOpt:=c1, returnType:=GetType(Boolean), globalsType:=Nothing))
Assert.True(c6.ReferenceManagerEquals(c5))
Dim c7 = c6.WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(previousCompilationOpt:=c2, returnType:=GetType(Boolean), globalsType:=Nothing))
Assert.False(c7.ReferenceManagerEquals(c6))
Dim c8 = c7.WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(previousCompilationOpt:=Nothing, returnType:=GetType(Boolean), globalsType:=Nothing))
Assert.False(c8.ReferenceManagerEquals(c7))
Dim c9 = c8.WithScriptCompilationInfo(Nothing)
Assert.True(c9.ReferenceManagerEquals(c8))
End Sub
Private Class EvolvingTestReference
Inherits PortableExecutableReference
Private ReadOnly _metadataSequence As IEnumerator(Of Metadata)
Public QueryCount As Integer
Public Sub New(metadataSequence As IEnumerable(Of Metadata))
MyBase.New(MetadataReferenceProperties.Assembly)
Me._metadataSequence = metadataSequence.GetEnumerator()
End Sub
Protected Overrides Function CreateDocumentationProvider() As DocumentationProvider
Return DocumentationProvider.Default
End Function
Protected Overrides Function GetMetadataImpl() As Metadata
QueryCount = QueryCount + 1
_metadataSequence.MoveNext()
Return _metadataSequence.Current
End Function
Protected Overrides Function WithPropertiesImpl(properties As MetadataReferenceProperties) As PortableExecutableReference
Throw New NotImplementedException()
End Function
End Class
<ConditionalFact(GetType(NoIOperationValidation), GetType(NoUsedAssembliesValidation))>
Public Sub MetadataConsistencyWhileEvolvingCompilation()
Dim md1 = AssemblyMetadata.CreateFromImage(CreateCompilationWithMscorlib40({"Public Class C : End Class"}, options:=TestOptions.ReleaseDll).EmitToArray())
Dim md2 = AssemblyMetadata.CreateFromImage(CreateCompilationWithMscorlib40({"Public Class D : End Class"}, options:=TestOptions.ReleaseDll).EmitToArray())
Dim reference = New EvolvingTestReference({md1, md2})
Dim references = TargetFrameworkUtil.Mscorlib40References.AddRange({reference, reference})
Dim c1 = CreateEmptyCompilation({"Public Class Main : Public Shared C As C : End Class"}, references:=references, options:=TestOptions.ReleaseDll)
Dim c2 = c1.WithAssemblyName("c2")
Dim c3 = c2.AddSyntaxTrees(Parse("Public Class Main2 : Public Shared A As Integer : End Class"))
Dim c4 = c3.WithOptions(New VisualBasicCompilationOptions(OutputKind.NetModule))
Dim c5 = c4.WithReferences({MscorlibRef, reference})
c3.VerifyDiagnostics()
c1.VerifyDiagnostics()
c4.VerifyDiagnostics()
c2.VerifyDiagnostics()
Assert.Equal(1, reference.QueryCount)
c5.VerifyDiagnostics(Diagnostic(ERRID.ERR_UndefinedType1, "C").WithArguments("C").WithLocation(1, 40))
Assert.Equal(2, reference.QueryCount)
End Sub
<Fact>
Public Sub LinkedNetmoduleMetadataMustProvideFullPEImage()
Dim moduleBytes = TestResources.MetadataTests.NetModule01.ModuleCS00
Dim headers = New PEHeaders(New MemoryStream(moduleBytes))
Dim pinnedPEImage = GCHandle.Alloc(moduleBytes.ToArray(), GCHandleType.Pinned)
Try
Using mdModule = ModuleMetadata.CreateFromMetadata(pinnedPEImage.AddrOfPinnedObject() + headers.MetadataStartOffset, headers.MetadataSize)
Dim c = VisualBasicCompilation.Create("Goo", references:={MscorlibRef, mdModule.GetReference(display:="ModuleCS00")}, options:=TestOptions.ReleaseDll)
c.VerifyDiagnostics(Diagnostic(ERRID.ERR_LinkedNetmoduleMetadataMustProvideFullPEImage).WithArguments("ModuleCS00").WithLocation(1, 1))
End Using
Finally
pinnedPEImage.Free()
End Try
End Sub
<Fact>
<WorkItem(797640, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/797640")>
Public Sub GetMetadataReferenceAPITest()
Dim comp = VisualBasicCompilation.Create("Compilation")
Dim metadata = NetFramework.mscorlib
comp = comp.AddReferences(metadata)
Dim assemblySmb = comp.GetReferencedAssemblySymbol(metadata)
Dim reference = comp.GetMetadataReference(assemblySmb)
Assert.NotNull(reference)
Dim comp2 = VisualBasicCompilation.Create("Compilation")
comp2 = comp.AddReferences(metadata)
Dim reference2 = comp2.GetMetadataReference(assemblySmb)
Assert.NotNull(reference2)
End Sub
<WorkItem(40466, "https://github.com/dotnet/roslyn/issues/40466")>
<Fact>
Public Sub GetMetadataReference_CSharpSymbols()
Dim comp As Compilation = CreateCompilation("")
Dim csComp = CreateCSharpCompilation("", referencedAssemblies:=TargetFrameworkUtil.GetReferences(TargetFramework.Standard))
Dim assembly = csComp.GetBoundReferenceManager().GetReferencedAssemblies().First().Value
Assert.Null(comp.GetMetadataReference(DirectCast(assembly.GetISymbol(), IAssemblySymbol)))
Assert.Null(comp.GetMetadataReference(csComp.Assembly))
Assert.Null(comp.GetMetadataReference(Nothing))
End Sub
<Fact()>
Public Sub EqualityOfMergedNamespaces()
Dim moduleComp = CompilationUtils.CreateEmptyCompilation(
<compilation>
<file name="a.vb">
Namespace NS1
Namespace NS3
Interface T1
End Interface
End Namespace
End Namespace
Namespace NS2
Namespace NS3
Interface T2
End Interface
End Namespace
End Namespace
</file>
</compilation>, options:=TestOptions.ReleaseModule)
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(
<compilation>
<file name="a.vb">
Namespace NS1
Namespace NS3
Interface T3
End Interface
End Namespace
End Namespace
Namespace NS2
Namespace NS3
Interface T4
End Interface
End Namespace
End Namespace
</file>
</compilation>, {moduleComp.EmitToImageReference()})
TestEqualityRecursive(compilation.GlobalNamespace,
compilation.GlobalNamespace,
NamespaceKind.Compilation,
Function(ns) compilation.GetCompilationNamespace(ns))
TestEqualityRecursive(compilation.Assembly.GlobalNamespace,
compilation.Assembly.GlobalNamespace,
NamespaceKind.Assembly,
Function(ns) compilation.Assembly.GetAssemblyNamespace(ns))
End Sub
Private Shared Sub TestEqualityRecursive(testNs1 As NamespaceSymbol,
testNs2 As NamespaceSymbol,
kind As NamespaceKind,
factory As Func(Of NamespaceSymbol, NamespaceSymbol))
Assert.Equal(kind, testNs1.NamespaceKind)
Assert.Same(testNs1, testNs2)
Dim children1 = testNs1.GetMembers().OrderBy(Function(m) m.Name).ToArray()
Dim children2 = testNs2.GetMembers().OrderBy(Function(m) m.Name).ToArray()
For i = 0 To children1.Count - 1
Assert.Same(children1(i), children2(i))
If children1(i).Kind = SymbolKind.Namespace Then
TestEqualityRecursive(DirectCast(testNs1.GetMembers(children1(i).Name).Single(), NamespaceSymbol),
DirectCast(testNs1.GetMembers(children1(i).Name).Single(), NamespaceSymbol),
kind,
factory)
End If
Next
Assert.Same(testNs1, factory(testNs1))
For Each constituent In testNs1.ConstituentNamespaces
Assert.Same(testNs1, factory(constituent))
Next
End Sub
<Fact>
Public Sub ConsistentParseOptions()
Dim tree1 = SyntaxFactory.ParseSyntaxTree("", VisualBasicParseOptions.Default.WithLanguageVersion(LanguageVersion.VisualBasic12))
Dim tree2 = SyntaxFactory.ParseSyntaxTree("", VisualBasicParseOptions.Default.WithLanguageVersion(LanguageVersion.VisualBasic12))
Dim tree3 = SyntaxFactory.ParseSyntaxTree("", VisualBasicParseOptions.Default.WithLanguageVersion(LanguageVersion.VisualBasic11))
Dim assemblyName = GetUniqueName()
Dim CompilationOptions = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
VisualBasicCompilation.Create(assemblyName, {tree1, tree2}, {MscorlibRef}, CompilationOptions)
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.Create(assemblyName, {tree1, tree3}, {MscorlibRef}, CompilationOptions))
End Sub
<Fact>
Public Sub SubmissionCompilation_Errors()
Dim genericParameter = GetType(List(Of)).GetGenericArguments()(0)
Dim open = GetType(Dictionary(Of,)).MakeGenericType(GetType(Integer), genericParameter)
Dim ptr = GetType(Integer).MakePointerType()
Dim byRefType = GetType(Integer).MakeByRefType()
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=genericParameter))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=open))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=GetType(Void)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", returnType:=byRefType))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=genericParameter))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=open))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=GetType(Void)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=GetType(Integer)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=ptr))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", globalsType:=byRefType))
Dim s0 = VisualBasicCompilation.CreateScriptCompilation("a0", globalsType:=GetType(List(Of Integer)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a1", previousScriptCompilation:=s0, globalsType:=GetType(List(Of Boolean))))
' invalid options
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseExe))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.NetModule)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeMetadata)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsRuntimeApplication)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithOutputKind(OutputKind.WindowsApplication)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithCryptoKeyContainer("goo")))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithCryptoKeyFile("goo.snk")))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithDelaySign(True)))
Assert.Throws(Of ArgumentException)(Function() VisualBasicCompilation.CreateScriptCompilation("a", options:=TestOptions.ReleaseDll.WithDelaySign(False)))
End Sub
<Fact>
Public Sub HasSubmissionResult()
Assert.False(VisualBasicCompilation.CreateScriptCompilation("sub").HasSubmissionResult())
Assert.True(CreateSubmission("?1", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.False(CreateSubmission("1", parseOptions:=TestOptions.Script).HasSubmissionResult())
' TODO (https://github.com/dotnet/roslyn/issues/4763): '?' should be optional
' TestSubmissionResult(CreateSubmission("1", parseOptions:=TestOptions.Interactive), expectedType:=SpecialType.System_Int32, expectedHasValue:=True)
' TODO (https://github.com/dotnet/roslyn/issues/4766): ReturnType should not be ignored
' TestSubmissionResult(CreateSubmission("?1", parseOptions:=TestOptions.Interactive, returnType:=GetType(Double)), expectedType:=SpecialType.System_Double, expectedHasValue:=True)
Assert.False(CreateSubmission("
Sub Goo()
End Sub
").HasSubmissionResult())
Assert.False(CreateSubmission("Imports System", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.False(CreateSubmission("Dim i As Integer", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.False(CreateSubmission("System.Console.WriteLine()", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("?System.Console.WriteLine()", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("System.Console.ReadLine()", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("?System.Console.ReadLine()", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("?Nothing", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("?AddressOf System.Console.WriteLine", parseOptions:=TestOptions.Script).HasSubmissionResult())
Assert.True(CreateSubmission("?Function(x) x", parseOptions:=TestOptions.Script).HasSubmissionResult())
End Sub
''' <summary>
''' Previous submission has to have no errors.
''' </summary>
<Fact>
Public Sub PreviousSubmissionWithError()
Dim s0 = CreateSubmission("Dim a As X = 1")
s0.VerifyDiagnostics(
Diagnostic(ERRID.ERR_UndefinedType1, "X").WithArguments("X"))
Assert.Throws(Of InvalidOperationException)(Function() CreateSubmission("?a + 1", previous:=s0))
End Sub
<Fact>
<WorkItem(13925, "https://github.com/dotnet/roslyn/issues/13925")>
Public Sub RemoveAllSyntaxTreesAndEmbeddedTrees_01()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation>
<file name="a.vb">
Public Module C
Sub Main()
System.Console.WriteLine(1)
End Sub
End Module
</file>
</compilation>, options:=TestOptions.ReleaseExe.WithEmbedVbCoreRuntime(True), references:={SystemRef})
compilation1.VerifyDiagnostics()
Dim compilation2 = compilation1.RemoveAllSyntaxTrees()
compilation2 = compilation2.AddSyntaxTrees(compilation1.SyntaxTrees)
compilation2.VerifyDiagnostics()
CompileAndVerify(compilation2, expectedOutput:="1")
End Sub
<Fact>
<WorkItem(13925, "https://github.com/dotnet/roslyn/issues/13925")>
Public Sub RemoveAllSyntaxTreesAndEmbeddedTrees_02()
Dim compilation1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation>
<file name="a.vb">
Public Module C
Sub Main()
System.Console.WriteLine(1)
End Sub
End Module
</file>
</compilation>, options:=TestOptions.ReleaseExe.WithEmbedVbCoreRuntime(True))
compilation1.VerifyDiagnostics()
Dim compilation2 = compilation1.RemoveAllSyntaxTrees()
compilation2 = compilation2.AddSyntaxTrees(compilation1.SyntaxTrees)
compilation2.VerifyDiagnostics()
CompileAndVerify(compilation2, expectedOutput:="1")
End Sub
<Fact, WorkItem(50696, "https://github.com/dotnet/roslyn/issues/50696")>
Public Sub GetWellKnownType()
Dim corlib = "
Namespace System
Public Class [Object]
End Class
Public Class ValueType
End Class
Public Structure Void
End Structure
End Namespace
"
Dim tuple = "
Namespace System
Public Structure ValueTuple(Of T1, T2)
Public Dim Item1 As T1
Public Dim Item2 As T2
Public Sub New(item1 As T1, item2 As T2)
me.Item1 = item1
me.Item2 = item2
End Sub
End Structure
End Namespace
"
Dim corlibWithoutValueTupleRef = CreateEmptyCompilation(corlib, assemblyName:="corlibWithoutValueTupleRef").EmitToImageReference()
Dim corlibWithValueTupleRef = CreateEmptyCompilation(corlib + tuple, assemblyName:="corlibWithValueTupleRef").EmitToImageReference()
Dim libWithIsExternalInitRef = CreateEmptyCompilation(tuple, references:={corlibWithoutValueTupleRef}, assemblyName:="libWithIsExternalInit").EmitToImageReference()
Dim libWithIsExternalInitRef2 = CreateEmptyCompilation(tuple, references:={corlibWithoutValueTupleRef}, assemblyName:="libWithIsExternalInit2").EmitToImageReference()
If True Then
' type in source
Dim comp = CreateEmptyCompilation(tuple, references:={corlibWithoutValueTupleRef}, assemblyName:="source")
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "source")
End If
If True Then
' type in library
Dim comp = CreateEmptyCompilation("", references:={corlibWithoutValueTupleRef, libWithIsExternalInitRef}, assemblyName:="source")
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "libWithIsExternalInit")
End If
If True Then
' type in corlib and in source
Dim comp = CreateEmptyCompilation(tuple, references:={corlibWithValueTupleRef}, assemblyName:="source")
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "source")
End If
If True Then
' type in corlib, in library and in source
Dim comp = CreateEmptyCompilation(tuple, references:={corlibWithValueTupleRef, libWithIsExternalInitRef}, assemblyName:="source")
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "source")
End If
If True Then
' type in corlib and in two libraries
Dim comp = CreateEmptyCompilation("", references:={corlibWithValueTupleRef, libWithIsExternalInitRef, libWithIsExternalInitRef2})
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "corlibWithValueTupleRef")
End If
If True Then
' type in corlib and in two libraries (corlib in middle)
Dim comp = CreateEmptyCompilation("", references:={libWithIsExternalInitRef, corlibWithValueTupleRef, libWithIsExternalInitRef2})
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "corlibWithValueTupleRef")
End If
If True Then
' type in corlib and in two libraries (corlib last)
Dim comp = CreateEmptyCompilation("", references:={libWithIsExternalInitRef, libWithIsExternalInitRef2, corlibWithValueTupleRef})
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "corlibWithValueTupleRef")
End If
If True Then
' type in corlib and in two libraries, but flag is set
Dim comp = CreateEmptyCompilation("", references:={corlibWithValueTupleRef, libWithIsExternalInitRef, libWithIsExternalInitRef2},
options:=TestOptions.DebugDll.WithIgnoreCorLibraryDuplicatedTypes(True))
AssertNoDeclarationDiagnostics(comp)
Assert.True(comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).IsErrorType)
End If
If True Then
' type in two libraries
Dim comp = CreateEmptyCompilation("", references:={libWithIsExternalInitRef, libWithIsExternalInitRef2})
AssertNoDeclarationDiagnostics(comp)
Assert.True(comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).IsErrorType)
End If
If True Then
' type in two libraries, but flag is set
Dim comp = CreateEmptyCompilation("", references:={libWithIsExternalInitRef, libWithIsExternalInitRef2},
options:=TestOptions.DebugDll.WithIgnoreCorLibraryDuplicatedTypes(True))
AssertNoDeclarationDiagnostics(comp)
Assert.True(comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).IsErrorType)
End If
If True Then
' type in corlib and in a library
Dim comp = CreateEmptyCompilation("", references:={corlibWithValueTupleRef, libWithIsExternalInitRef})
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "corlibWithValueTupleRef")
End If
If True Then
' type in corlib and in a library (reverse order)
Dim comp = CreateEmptyCompilation("", references:={corlibWithValueTupleRef, libWithIsExternalInitRef})
AssertNoDeclarationDiagnostics(comp)
GetWellKnownType_Verify(comp, "corlibWithValueTupleRef")
End If
If True Then
' type in corlib and in a library, but flag is set
Dim comp = CreateEmptyCompilation("", references:={corlibWithValueTupleRef, libWithIsExternalInitRef},
options:=TestOptions.DebugDll.WithIgnoreCorLibraryDuplicatedTypes(True))
AssertNoDeclarationDiagnostics(comp)
Assert.Equal("libWithIsExternalInit", comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).ContainingAssembly.Name)
Assert.Equal("corlibWithValueTupleRef", comp.GetTypeByMetadataName("System.ValueTuple`2").ContainingAssembly.Name)
End If
End Sub
Private Shared Sub GetWellKnownType_Verify(comp As VisualBasicCompilation, expectedAssemblyName As String)
Assert.Equal(expectedAssemblyName, comp.GetWellKnownType(WellKnownType.System_ValueTuple_T2).ContainingAssembly.Name)
Assert.Equal(expectedAssemblyName, comp.GetTypeByMetadataName("System.ValueTuple`2").ContainingAssembly.Name)
End Sub
End Class
End Namespace
|