|
' 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.Globalization
Imports System.Text
Imports System.Xml.Linq
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests.Symbols
Imports Roslyn.Test.Utilities
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
Public Class SourceSymbolTests
Inherits BasicTestBase
<WorkItem(539740, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539740")>
<Fact()>
Public Sub NamespaceWithoutName()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="TST">
<file name="a.vb">
Namespace' A
'End Namespace
</file>
</compilation>
)
Dim errors = compilation.GetDiagnostics().ToArray()
Assert.Equal(2, errors.Count)
Assert.Equal(1, compilation.SyntaxTrees.Length)
Dim tree = compilation.SyntaxTrees(0)
Dim model = compilation.GetSemanticModel(tree)
Dim nsArray = tree.GetRoot().DescendantNodes().Where(Function(node) (node.Kind = SyntaxKind.NamespaceStatement)).ToArray()
Assert.Equal(1, nsArray.Length)
Dim nsSyntax = DirectCast(nsArray(0), NamespaceStatementSyntax)
Dim symbol = model.GetDeclaredSymbol(nsSyntax)
Assert.Equal(String.Empty, symbol.Name)
End Sub
<WorkItem(540447, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540447")>
<Fact()>
Public Sub FunctionWithoutName()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="TST">
<file name="a.vb">
Class Program
Private Function (q As Integer) As Integer
Return q
End Function
End Class
</file>
</compilation>
)
CompilationUtils.AssertTheseDiagnostics(compilation,
<errors>
BC30203: Identifier expected.
Private Function (q As Integer) As Integer
~
</errors>)
End Sub
<WorkItem(540655, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540655")>
<Fact()>
Public Sub Bug6998()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="TST">
<file name="a.vb">
Class Program
Public Delegate Sub Goo(Of R)(r1 As R)
Public Delegate Function Bar(Of R)(r2 As R) As Integer
End Class
</file>
</compilation>
)
Dim tree = compilation.SyntaxTrees(0)
Dim model = compilation.GetSemanticModel(tree)
Dim r1 = TryCast(tree.FindNodeOrTokenByKind(SyntaxKind.ModifiedIdentifier, 1).AsNode(), ModifiedIdentifierSyntax)
Dim r1Type = model.GetDeclaredSymbol(r1)
Assert.NotNull(r1Type)
Assert.Equal(SymbolKind.Parameter, r1Type.Kind)
Assert.Equal("r1", r1Type.Name)
Dim r2 = TryCast(tree.FindNodeOrTokenByKind(SyntaxKind.ModifiedIdentifier, 2).AsNode(), ModifiedIdentifierSyntax)
Dim r2Type = model.GetDeclaredSymbol(r2)
Assert.NotNull(r2Type)
Assert.Equal(SymbolKind.Parameter, r2Type.Kind)
Assert.Equal("r2", r2Type.Name)
End Sub
<WorkItem(546566, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546566")>
<Fact()>
Public Sub Bug16199()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="TST">
<file name="a.vb">
Namespace NS
Namespace Name1
End Namespace
Class Name2
End Class
Namespace Name3
End Namespace
Class Name4
End Class
Namespace Name5
End Namespace
End Namespace
</file>
<file name="b.vb">
Namespace NS
Namespace Name3
End Namespace
Class Name5
End Class
Namespace Name5
End Namespace
End Namespace
</file>
<file name="c.vb">
Namespace NS
Structure Name4
End Structure
Structure Name5
End Structure
End Namespace
</file>
</compilation>
)
Dim ns = DirectCast(compilation.GlobalNamespace.GetMembers("NS").Single(), NamespaceSymbol)
Dim members1 = ns.GetMembers("Name1")
Dim types1 = ns.GetTypeMembers("Name1")
Assert.Equal(1, members1.Length)
Assert.True(types1.IsEmpty)
Dim members2 = ns.GetMembers("Name2")
Dim types2 = ns.GetTypeMembers("Name2")
Assert.Equal(1, members2.Length)
Assert.Equal(1, types2.Length)
Dim members3 = ns.GetMembers("Name3")
Dim types3 = ns.GetTypeMembers("Name3")
Assert.Equal(1, members3.Length)
Assert.True(types1.IsEmpty)
Dim members4 = ns.GetMembers("Name4")
Dim types4 = ns.GetTypeMembers("Name4")
Assert.Equal(2, members4.Length)
Assert.Equal(2, types4.Length)
Dim members5 = ns.GetMembers("Name5")
Dim types5 = ns.GetTypeMembers("Name5")
Assert.Equal(3, members5.Length)
Assert.Equal(2, types5.Length)
CompilationUtils.AssertTheseDiagnostics(compilation,
<errors>
BC30179: class 'Name4' and structure 'Name4' conflict in namespace 'NS'.
Class Name4
~~~~~
BC30179: class 'Name5' and namespace 'Name5' conflict in namespace 'NS'.
Class Name5
~~~~~
BC30179: structure 'Name4' and class 'Name4' conflict in namespace 'NS'.
Structure Name4
~~~~~
BC30179: structure 'Name5' and namespace 'Name5' conflict in namespace 'NS'.
Structure Name5
~~~~~
</errors>)
End Sub
<Fact()>
Public Sub EmptyCompilation()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="Banana">
</compilation>)
Assert.Equal("Banana", compilation.Assembly.Name)
Assert.Equal(0, compilation.SyntaxTrees.Length)
Dim mscorlibAssembly = compilation.GetReferencedAssemblySymbol(compilation.References(0))
Assert.Equal("mscorlib", mscorlibAssembly.Name)
CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
End Sub
<Fact()>
Public Sub DefaultBaseClass()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="C">
<file name="a.vb">
Class C
End Class
Structure S
End Structure
Interface I
End Interface
Enum E
Enumerator
End Enum
Module M
End Module
Delegate Sub D()
</file>
</compilation>)
Dim globalNS = compilation.SourceModule.GlobalNamespace
Dim globalNSmembers = globalNS.GetMembers()
Dim classC = DirectCast(globalNS.GetMembers("C").First(), NamedTypeSymbol)
Dim structureS = DirectCast(globalNS.GetMembers("S").First(), NamedTypeSymbol)
Dim interfaceI = DirectCast(globalNS.GetMembers("I").First(), NamedTypeSymbol)
Dim enumE = DirectCast(globalNS.GetMembers("E").First(), NamedTypeSymbol)
Dim moduleM = DirectCast(globalNS.GetMembers("M").First(), NamedTypeSymbol)
Dim delegateD = DirectCast(globalNS.GetMembers("D").First(), NamedTypeSymbol)
Assert.Equal("System.Object", classC.BaseType.ToTestDisplayString())
Assert.Equal("System.ValueType", structureS.BaseType.ToTestDisplayString())
Assert.Null(interfaceI.BaseType)
Assert.Equal("System.Enum", enumE.BaseType.ToTestDisplayString())
Assert.Equal("System.Object", moduleM.BaseType.ToTestDisplayString())
Assert.Equal("System.MulticastDelegate", delegateD.BaseType.ToTestDisplayString())
CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
End Sub
<Fact()>
Public Sub BaseClass()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
<file name="a.vb">
Class Y
Class Inner
End Class
End Class
Partial Class X
Inherits Y
Public f1 as Inner
End Class
</file>
<file name="b.vb">
Partial Class X
Inherits Y
Public f2 as Inner
End Class
</file>
</compilation>)
Dim globalNS = compilation.SourceModule.GlobalNamespace
Dim globalNSmembers = globalNS.GetMembers()
Dim classX = DirectCast(globalNS.GetMembers("X").First(), NamedTypeSymbol)
Dim classY = DirectCast(globalNS.GetMembers("Y").First(), NamedTypeSymbol)
Dim inner = DirectCast(classY.GetMembers("Inner").First(), NamedTypeSymbol)
Assert.Equal(globalNS, classX.ContainingSymbol)
Assert.Equal("X", classX.Name, IdentifierComparison.Comparer)
Assert.Equal(classY, classX.BaseType)
Dim f1Field = DirectCast(classX.GetMembers("f1").First(), FieldSymbol)
Assert.Equal(inner, f1Field.Type)
Dim f2Field = DirectCast(classX.GetMembers("f2").First(), FieldSymbol)
Assert.Equal(inner, f2Field.Type)
CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
End Sub
<Fact()>
Public Sub SymbolLocations()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
<file name="a.vb">
Public Partial Class C
Public Sub m1(x as Integer)
End Sub
Public Partial Class D(Of T)
Public v1$, v2$
End Class
End Class
Namespace N1
Namespace N2
Namespace N3
End Namespace
End Namespace
End Namespace
</file>
<file name="b.vb">
Option Strict On
Public Partial Class C
Public Partial Class D(Of T)
End Class
End Class
Namespace N1.N2.N3
End Namespace
</file>
</compilation>)
Dim globalNS = compilation.SourceModule.GlobalNamespace
Dim sourceMod = DirectCast(compilation.SourceModule, SourceModuleSymbol)
Dim globalNSmembers = globalNS.GetMembers().AsEnumerable().OrderBy(Function(m) m.Name).ToArray()
Dim classC = DirectCast(globalNSmembers(0), NamedTypeSymbol)
Dim membersOfC = classC.GetMembers().AsEnumerable().OrderBy(Function(s) s.Name).ToArray()
Dim classD = DirectCast(membersOfC(1), NamedTypeSymbol)
Dim membersOfD = classD.GetMembers().AsEnumerable().OrderBy(Function(s) s.Name).ToArray()
Dim m1 = DirectCast(membersOfC(2), MethodSymbol)
Dim p1 = m1.Parameters(0)
Dim v1 = DirectCast(membersOfD(1), FieldSymbol)
Dim tp1 = DirectCast(classD.TypeParameters(0), TypeParameterSymbol)
Dim n1 = DirectCast(globalNSmembers(1), NamespaceSymbol)
Dim membersOfN1 = n1.GetMembers().AsEnumerable().OrderBy(Function(s) s.Name).ToArray()
Dim n2 = DirectCast(membersOfN1(0), NamespaceSymbol)
Dim membersOfN2 = n2.GetMembers().AsEnumerable().OrderBy(Function(s) s.Name).ToArray()
Dim n3 = DirectCast(membersOfN2(0), NamespaceSymbol)
Dim locs As Location()
locs = (From l In classC.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("C", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("C", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In classD.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("D", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("D", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In tp1.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("T", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("T", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In m1.Locations
Select l).ToArray()
Assert.Equal(1, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("m1", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
locs = (From l In p1.Locations
Select l).ToArray()
Assert.Equal(1, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("x", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
locs = (From l In v1.Locations
Select l).ToArray()
Assert.Equal(1, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("v1$", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
locs = (From l In n1.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("N1", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("N1", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In n2.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("N2", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("N2", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In n3.Locations.AsEnumerable()
Order By l.SourceTree.FilePath
Select l).ToArray()
Assert.Equal(2, locs.Length)
Assert.Equal("a.vb", locs(0).SourceTree.FilePath)
Assert.Equal("N3", locs(0).SourceTree.GetText().ToString(locs(0).SourceSpan))
Assert.Equal("b.vb", locs(1).SourceTree.FilePath)
Assert.Equal("N3", locs(1).SourceTree.GetText().ToString(locs(1).SourceSpan))
locs = (From l In globalNS.Locations.AsEnumerable()
Order By l.PossiblyEmbeddedOrMySourceTree.FilePath
Select l).ToArray()
Assert.Equal(3, locs.Length)
CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
End Sub
<WorkItem(537442, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537442")>
<Fact()>
Public Sub InvalidOptionCompare()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
<file name="a.vb">
option Compare <![CDATA[qqqqqq]]>
Namespace Misc003aErr
Friend Module Misc003aErrmod
Function goo(x as Integer) as Boolean
return x = 42
End Function
End Module
End Namespace
</file>
</compilation>)
Dim globalNS = compilation.SourceModule.GlobalNamespace
Dim ns = DirectCast(globalNS.GetMembers("Misc003aErr").First(), NamespaceSymbol)
Dim errmod = DirectCast(ns.GetMembers("Misc003aErrmod").First(), NamedTypeSymbol)
Dim mems = errmod.GetMembers()
Assert.Equal(1, mems.Length)
End Sub
<WorkItem(527175, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527175")>
<Fact()>
Public Sub DoubleBracketsNames()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
<file name="a.vb">
Option Strict Off
Option Explicit On
Imports VB6 = Microsoft.VisualBasic
Namespace SharedGen007
Friend Class [[ident1]]
'Scenario1
public shared [[ident3]](9) as Short
'Scenario3
Friend Shared [[ident5]]() as double
'Scenario4
protected friend shared [[ident6]]() as integer
'Scenario5
public shared [[ident7]](2, 3) as object
'Scenario6
protected friend shared [[ident8]](,) as string
'Scenario7
Public shared [[ident9]]() as double
End Class
End Namespace
</file>
</compilation>)
Dim globalNS = compilation.SourceModule.GlobalNamespace
Dim ns = DirectCast(globalNS.GetMembers("SharedGen007").First(), NamespaceSymbol)
Dim type1 = DirectCast(ns.GetTypeMembers().First(), NamedTypeSymbol)
Assert.Equal("SharedGen007.?", type1.ToDisplayString())
' Won't fix
'Assert.Equal("[ident1]", type1.Name)
'For Each m In type1.GetMembers()
' Assert.NotEmpty(m.Name)
'Next
End Sub
<WorkItem(542508, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542508")>
<Fact()>
Public Sub LocalsWithoutAsClauseInForStatement()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="LocalsWithoutAsClauseInForStatement">
<file name="a.vb">
Imports System
Module Program
Sub Main()
For a = 1 To 6
Console.WriteLine(a)
Next
End Sub
End Module
</file>
</compilation>
)
Dim tree = compilation.SyntaxTrees(0)
Dim model = compilation.GetSemanticModel(tree)
Dim list = tree.GetRoot().DescendantNodes().Where(Function(n) (n.Kind = SyntaxKind.ForStatement)).ToArray()
Assert.Equal(1, list.Length)
Dim node = DirectCast(list(0), ForStatementSyntax)
Dim symbol = model.GetDeclaredSymbol(node)
Assert.Null(symbol)
End Sub
<WorkItem(543720, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543720")>
<Fact()>
Public Sub InvalidLocalsWithColon()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="InvalidLocalsWithColon">
<file name="a.vb">
Module Program
Sub Main()
Dim [goo as integer : Dim [goo As Char
End Sub
End Module
</file>
</compilation>
)
compilation.VerifyDiagnostics(
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_MissingEndBrack, "[goo"),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_MissingEndBrack, "[goo"))
End Sub
<WorkItem(187865, "https://devdiv.visualstudio.com:443/defaultcollection/DevDiv/_workitems/edit/187865")>
<Fact>
Public Sub DifferentMembersMetadataName()
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation>
<file name="a.vb">
Delegate Sub D()
Class C
Function Get_P(o As Object) As Object
Return o
End Function
Function p(o As Object) As Object
Return o
End Function
ReadOnly Property P As Object
Get
Return Nothing
End Get
End Property
Event E As D
Sub Add_E()
End Sub
ReadOnly Property add_e As Object
Get
Return Nothing
End Get
End Property
Declare Sub ADD_E Lib "A" (o As Object)
End Class
</file>
</compilation>)
compilation.AssertTheseDiagnostics(
<expected>
BC31061: function 'Get_P' conflicts with a member implicitly declared for property 'P' in class 'C'.
Function Get_P(o As Object) As Object
~~~~~
BC30260: 'P' is already declared as 'Public Function p(o As Object) As Object' in this class.
ReadOnly Property P As Object
~
BC31060: event 'E' implicitly defines 'add_E', which conflicts with a member of the same name in class 'C'.
Event E As D
~
BC31060: event 'E' implicitly defines 'add_E', which conflicts with a member of the same name in class 'C'.
Event E As D
~
BC31060: event 'E' implicitly defines 'add_E', which conflicts with a member of the same name in class 'C'.
Event E As D
~
</expected>)
Dim type = compilation.GetMember(Of NamedTypeSymbol)("C")
Dim members = type.GetMembers("P")
Assert.Equal(2, members.Length)
Assert.Equal("p", members(0).MetadataName)
Assert.Equal("P", members(1).MetadataName)
members = type.GetMembers("get_P")
Assert.Equal(2, members.Length)
Assert.Equal("Get_P", members(0).MetadataName)
Assert.Equal("get_P", members(1).MetadataName)
members = type.GetMembers("add_E")
Assert.Equal(4, members.Length)
Assert.Equal("add_E", members(0).MetadataName)
Assert.Equal("Add_E", members(1).MetadataName)
Assert.Equal("add_e", members(2).MetadataName)
Assert.Equal("Add_E", members(3).MetadataName)
End Sub
''' <summary>
''' Symbol location order should be preserved when trees
''' are replaced in the compilation.
''' </summary>
<WorkItem(11015, "https://github.com/dotnet/roslyn/issues/11015")>
<Fact>
Public Sub PreserveLocationOrderOnReplaceSyntaxTree()
Dim source0 = Parse(
"Namespace N
Partial Class C
End Class
End Namespace
Namespace N0
Class C0
End Class
End Namespace")
Dim source1 = Parse(
"Namespace N
Partial Class C
End Class
End Namespace
Namespace N1
Class C1
End Class
End Namespace")
Dim source2 = Parse(
"Namespace N
Structure S
End Structure
End Namespace")
Dim source3 = Parse(
"Namespace N
Partial Class C
End Class
End Namespace
Namespace N3
Class C3
End Class
End Namespace")
Dim comp0 = CompilationUtils.CreateCompilationWithMscorlib40({source0, source1, source2, source3}, options:=TestOptions.ReleaseDll)
comp0.AssertTheseDiagnostics()
Assert.Equal({source0, source1, source2, source3}, comp0.SyntaxTrees)
Dim locations = comp0.GlobalNamespace.Locations
Assert.Equal({"MyTemplateLocation", "SourceLocation", "SourceLocation", "SourceLocation", "SourceLocation", "MetadataLocation"}, locations.Select(Function(l) l.GetType().Name))
' Location order of partial class should match SyntaxTrees order.
locations = comp0.GetMember(Of NamedTypeSymbol)("N.C").Locations
Assert.Equal({source0, source1, source3}, locations.Select(Function(l) l.SourceTree))
' AddSyntaxTrees will add to the end.
Dim source4 = Parse(
"Namespace N
Partial Class C
End Class
End Namespace
Namespace N4
Class C4
End Class
End Namespace")
Dim comp1 = comp0.AddSyntaxTrees(source4)
locations = comp1.GetMember(Of NamedTypeSymbol)("N.C").Locations
Assert.Equal({source0, source1, source3, source4}, locations.Select(Function(l) l.SourceTree))
' ReplaceSyntaxTree should preserve location order.
Dim comp2 = comp0.ReplaceSyntaxTree(source1, source4)
locations = comp2.GetMember(Of NamedTypeSymbol)("N.C").Locations
Assert.Equal({source0, source4, source3}, locations.Select(Function(l) l.SourceTree))
' NamespaceNames and TypeNames do not match SyntaxTrees order.
' This is expected.
AssertEx.Equal({"", "N3", "N0", "N", "", "N4", "N"}, comp2.Declarations.NamespaceNames.ToArray())
AssertEx.Equal({"C3", "C0", "S", "C", "C4", "C"}, comp2.Declarations.TypeNames.ToArray())
' RemoveSyntaxTrees should preserve order of remaining trees.
Dim comp3 = comp2.RemoveSyntaxTrees(source0)
locations = comp3.GetMember(Of NamedTypeSymbol)("N.C").Locations
Assert.Equal({source4, source3}, locations.Select(Function(l) l.SourceTree))
End Sub
End Class
End Namespace
|