File: SymbolsTests\Source\TypeSubstitutionTests.vb
Web Access
Project: ..\..\..\src\Compilers\VisualBasic\Test\Symbol\Microsoft.CodeAnalysis.VisualBasic.Symbol.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.Symbol.UnitTests)
' 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
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
    Public Class TypeSubstitutionTests
        <Fact>
        Public Sub Substitution1()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic        
Class G(Of T, U)
    Public a As T
    Public b as U()
    Public c As Dictionary(Of U, IEnumerable(Of T))
    Public d As G(Of T, U)
    Public Function e(ByRef p1 as T, p2 as U(), p3 as G(Of T, U)) As Dictionary(Of IEnumerable(Of U), T)
        Return Nothing
    End Function
End Class    
    </file>
    <file name="b.vb">
Class B
    Public x as G(Of Integer, String)
End Class
    </file>
</compilation>)
 
            Dim globalNS = compilation.SourceModule.GlobalNamespace
            Dim classB = DirectCast(globalNS.GetTypeMembers("B").First, NamedTypeSymbol)
            Dim fieldx = DirectCast(classB.GetMembers("x").First, FieldSymbol)
            Dim substType = fieldx.Type
 
            Dim substFieldA = DirectCast(substType.GetMembers("a").First, FieldSymbol)
            Assert.Equal("System.Int32", substFieldA.Type.ToTestDisplayString())
 
            Dim substFieldB = DirectCast(substType.GetMembers("b").First, FieldSymbol)
            Assert.Equal("System.String()", substFieldB.Type.ToTestDisplayString())
 
            Dim substFieldC = DirectCast(substType.GetMembers("c").First, FieldSymbol)
            Assert.Equal("System.Collections.Generic.Dictionary(Of System.String, System.Collections.Generic.IEnumerable(Of System.Int32))",
                         substFieldC.Type.ToTestDisplayString())
 
            Dim substFieldD = DirectCast(substType.GetMembers("d").First, FieldSymbol)
            Assert.Equal("G(Of System.Int32, System.String)", substFieldD.Type.ToTestDisplayString())
            Assert.Equal(substFieldD.ContainingType, substFieldD.Type)
 
            Dim substMethodE = DirectCast(substType.GetMembers("e").First, MethodSymbol)
            Assert.Equal("Function G(Of System.Int32, System.String).e(ByRef p1 As System.Int32, p2 As System.String(), p3 As G(Of System.Int32, System.String)) As System.Collections.Generic.Dictionary(Of System.Collections.Generic.IEnumerable(Of System.String), System.Int32)",
                         substMethodE.ToTestDisplayString())
 
            CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
        End Sub
 
        <Fact>
        Public Sub Substitution2()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(
<compilation name="C">
    <file name="a.vb">
Namespace Goo
    Class B(Of R, S)
        Function Func(ByVal p1 As R) As S
        End Function
    End Class
 
    Class C(Of T)
        Class E(Of U)
            Inherits B(Of T, U)
        End Class
 
        Class D
            Inherits C(Of String)
            Class F
                Inherits E(Of K(Of T))
            End Class
        End Class
    End Class
 
    Class J
        Inherits C(Of Integer)
    End Class
End Namespace
 
Class K(Of W)
End Class
    </file>
</compilation>)
 
            Dim globalNS = compilation.SourceModule.GlobalNamespace
            Dim gooNS = DirectCast(globalNS.GetMembers("Goo").First, NamespaceSymbol)
 
            Dim classDSymbol As TypeSymbol = DirectCast(DirectCast(GooNS.GetMembers("J").First(), NamedTypeSymbol).BaseType.GetMembers("D").First(), NamedTypeSymbol)
            Assert.Equal("Goo.C(Of System.Int32).D", classDSymbol.ToTestDisplayString())
            Dim classFSymbol = DirectCast(classDSymbol.GetMembers("F").First(), TypeSymbol)
            Assert.Equal("Goo.C(Of System.Int32).D.F", classFSymbol.ToTestDisplayString())
            Dim classFBaseType = classFSymbol.BaseType
            Dim classFBaseTypeSquared = classFBaseType.BaseType
            Assert.Equal("Goo.B(Of System.String, K(Of System.Int32))", classFBaseTypeSquared.ToTestDisplayString())
 
            Dim method = classFSymbol.BaseType.BaseType.GetMembers("Func").First()
            Assert.Equal("Function Goo.B(Of System.String, K(Of System.Int32)).Func(p1 As System.String) As K(Of System.Int32)", method.ToTestDisplayString())
 
            CompilationUtils.AssertNoDeclarationDiagnostics(compilation)
        End Sub
    End Class
End Namespace