File: SymbolsTests\Metadata\PE\LoadingGenericTypeParameters.vb
Web Access
Project: src\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 Basic.Reference.Assemblies
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Roslyn.Test.Utilities
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Symbols.Metadata.PE
 
    Public Class LoadingGenericTypeParameters : Inherits BasicTestBase
 
        <Fact>
        Public Sub Test1()
            Dim assembly = MetadataTestHelpers.LoadFromBytes(Net40.Resources.mscorlib)
            Dim module0 = assembly.Modules(0)
 
            Dim objectType = module0.GlobalNamespace.GetMembers("System").
                OfType(Of NamespaceSymbol).Single().
                GetTypeMembers("Object").Single()
 
            Assert.Equal(0, objectType.Arity)
            Assert.Equal(0, objectType.TypeParameters.Length)
            Assert.Equal(0, objectType.TypeArguments.Length)
 
            assembly = MetadataTestHelpers.LoadFromBytes(TestResources.General.MDTestLib1)
            module0 = assembly.Modules(0)
 
            Dim C1 = module0.GlobalNamespace.GetTypeMembers("C1").Single()
 
            Assert.Equal(1, C1.Arity)
            Assert.Equal(1, C1.TypeParameters.Length)
            Assert.Equal(1, C1.TypeArguments.Length)
 
            Dim C1_T = C1.TypeParameters(0)
 
            Assert.Equal(C1_T, C1.TypeArguments(0))
 
            Assert.Null(C1_T.BaseType)
            Assert.Equal(assembly, C1_T.ContainingAssembly)
            Assert.Equal(module0.GlobalNamespace, C1_T.ContainingNamespace) 'Null(C1_T.ContainingNamespace)
            Assert.Equal(C1, C1_T.ContainingSymbol)
            Assert.Equal(C1, C1_T.ContainingType)
            Assert.Equal(Accessibility.NotApplicable, C1_T.DeclaredAccessibility)
            Assert.Equal("C1_T", C1_T.Name)
            Assert.Equal("C1_T", C1_T.ToTestDisplayString())
            Assert.Equal(0, C1_T.GetMembers().Length())
            Assert.Equal(0, C1_T.GetMembers("goo").Length())
            Assert.Equal(0, C1_T.GetTypeMembers().Length())
            Assert.Equal(0, C1_T.GetTypeMembers("goo").Length())
            Assert.Equal(0, C1_T.GetTypeMembers("goo", 1).Length())
            Assert.False(C1_T.HasConstructorConstraint)
            Assert.False(C1_T.HasReferenceTypeConstraint)
            Assert.False(C1_T.HasValueTypeConstraint)
            Assert.Equal(0, C1_T.Interfaces.Length)
            Assert.True(C1_T.IsDefinition)
            Assert.False(C1_T.IsMustOverride)
            Assert.False(C1_T.IsNamespace)
            Assert.False(C1_T.IsNotOverridable)
            Assert.False(C1_T.IsOverridable)
            Assert.False(C1_T.IsOverrides)
            Assert.False(C1_T.IsShared)
            Assert.True(C1_T.IsType)
            Assert.Equal(SymbolKind.TypeParameter, C1_T.Kind)
            Assert.Equal(0, C1_T.Ordinal)
            Assert.Equal(C1_T, C1_T.OriginalDefinition)
            Assert.Equal(TypeKind.TypeParameter, C1_T.TypeKind)
            Assert.Equal(VarianceKind.None, C1_T.Variance)
            Assert.Same(module0, C1_T.Locations.Single().MetadataModule)
            Assert.Equal(0, C1_T.ConstraintTypes.Length)
 
            Dim C2 = C1.GetTypeMembers("C2").Single()
            Assert.Equal(1, C2.Arity)
            Assert.Equal(1, C2.TypeParameters.Length)
            Assert.Equal(1, C2.TypeArguments.Length)
 
            Dim C2_T = C2.TypeParameters(0)
 
            Assert.Equal("C2_T", C2_T.Name)
            Assert.Equal(C2, C2_T.ContainingType)
 
            Dim C3 = C1.GetTypeMembers("C3").Single()
            Assert.Equal(0, C3.Arity)
            Assert.Equal(0, C3.TypeParameters.Length)
            Assert.Equal(0, C3.TypeArguments.Length)
 
            Dim C4 = C3.GetTypeMembers("C4").Single()
            Assert.Equal(1, C4.Arity)
            Assert.Equal(1, C4.TypeParameters.Length)
            Assert.Equal(1, C4.TypeArguments.Length)
 
            Dim C4_T = C4.TypeParameters(0)
 
            Assert.Equal("C4_T", C4_T.Name)
            Assert.Equal(C4, C4_T.ContainingType)
 
            Dim TC2 = module0.GlobalNamespace.GetTypeMembers("TC2").Single()
 
            Assert.Equal(2, TC2.Arity)
            Assert.Equal(2, TC2.TypeParameters.Length)
            Assert.Equal(2, TC2.TypeArguments.Length)
 
            Dim TC2_T1 = TC2.TypeParameters(0)
            Dim TC2_T2 = TC2.TypeParameters(1)
 
            Assert.Equal(TC2_T1, TC2.TypeArguments(0))
            Assert.Equal(TC2_T2, TC2.TypeArguments(1))
 
            Assert.Equal("TC2_T1", TC2_T1.Name)
            Assert.Equal(TC2, TC2_T1.ContainingType)
            Assert.Equal(0, TC2_T1.Ordinal)
 
            Assert.Equal("TC2_T2", TC2_T2.Name)
            Assert.Equal(TC2, TC2_T2.ContainingType)
            Assert.Equal(1, TC2_T2.Ordinal)
 
            Dim C100 = module0.GlobalNamespace.GetTypeMembers("C100").Single()
            Dim T = C100.TypeParameters(0)
            Assert.False(T.HasConstructorConstraint)
            Assert.False(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.Out, T.Variance)
 
            Dim C101 = module0.GlobalNamespace.GetTypeMembers("C101").Single()
            T = C101.TypeParameters(0)
            Assert.False(T.HasConstructorConstraint)
            Assert.False(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.In, T.Variance)
 
            Dim C102 = module0.GlobalNamespace.GetTypeMembers("C102").Single()
            T = C102.TypeParameters(0)
            Assert.True(T.HasConstructorConstraint)
            Assert.False(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.None, T.Variance)
            Assert.Equal(0, T.ConstraintTypes.Length)
 
            Dim C103 = module0.GlobalNamespace.GetTypeMembers("C103").Single()
            T = C103.TypeParameters(0)
            Assert.False(T.HasConstructorConstraint)
            Assert.True(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.None, T.Variance)
            Assert.Equal(0, T.ConstraintTypes.Length)
 
            Dim C104 = module0.GlobalNamespace.GetTypeMembers("C104").Single()
            T = C104.TypeParameters(0)
            Assert.False(T.HasConstructorConstraint)
            Assert.False(T.HasReferenceTypeConstraint)
            Assert.True(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.None, T.Variance)
            Assert.Equal(0, T.ConstraintTypes.Length)
 
            Dim C105 = module0.GlobalNamespace.GetTypeMembers("C105").Single()
            T = C105.TypeParameters(0)
            Assert.True(T.HasConstructorConstraint)
            Assert.True(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.None, T.Variance)
 
            Dim C106 = module0.GlobalNamespace.GetTypeMembers("C106").Single()
            T = C106.TypeParameters(0)
            Assert.True(T.HasConstructorConstraint)
            Assert.True(T.HasReferenceTypeConstraint)
            Assert.False(T.HasValueTypeConstraint)
            Assert.Equal(VarianceKind.Out, T.Variance)
 
            Dim I101 = module0.GlobalNamespace.GetTypeMembers("I101").Single()
            Dim I102 = module0.GlobalNamespace.GetTypeMembers("I102").Single()
 
            Dim C201 = module0.GlobalNamespace.GetTypeMembers("C201").Single()
            T = C201.TypeParameters(0)
            Assert.Equal(1, T.ConstraintTypes.Length)
            Assert.Same(I101, T.ConstraintTypes.ElementAt(0))
 
            Dim C202 = module0.GlobalNamespace.GetTypeMembers("C202").Single()
            T = C202.TypeParameters(0)
            Assert.Equal(2, T.ConstraintTypes.Length)
            Assert.Same(I101, T.ConstraintTypes.ElementAt(0))
            Assert.Same(I102, T.ConstraintTypes.ElementAt(1))
 
        End Sub
 
        <WorkItem(619267, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/619267")>
        <Fact>
        Public Sub InvalidNestedArity_2()
            Dim ilSource = <![CDATA[
.class interface public abstract I0
{
  .class interface abstract nested public IT<T>
  {
    .class interface abstract nested public I0 { }
  }
}
.class interface public abstract IT<T>
{
  .class interface abstract nested public I0
  {
    .class interface abstract nested public I0 { }
    .class interface abstract nested public IT<T> { }
  }
  .class interface abstract nested public IT<T>
  {
    .class interface abstract nested public I0 { }
  }
  .class interface abstract nested public ITU<T, U>
  {
    .class interface abstract nested public IT<T> { }
  }
}
]]>.Value
            Dim vbSource =
                <compilation>
                    <file name="c.vb"><![CDATA[
Class C0_T
    Implements I0.IT(Of Object)
End Class
Class C0_T_0
    Implements I0.IT(Of Object).I0
End Class
Class CT_0
    Implements IT(Of Object).I0
End Class
Class CT_0_0
    Implements IT(Of Object).I0.I0
End Class
Class CT_0_T
    Implements IT(Of Object).I0.IT
End Class
Class CT_T_0
    Implements IT(Of Object).IT.I0
End Class
Class CT_TU_T
    Implements IT(Of Object).ITU(Of Integer).IT
End Class
]]>
                    </file>
                </compilation>
            Dim comp = CreateCompilationWithCustomILSource(vbSource, ilSource)
            comp.AssertTheseDiagnostics(<expected>
BC30649: 'I0.IT(Of T).I0' is an unsupported type.
    Implements I0.IT(Of Object).I0
               ~~~~~~~~~~~~~~~~~~~
BC30649: 'IT(Of T).I0' is an unsupported type.
    Implements IT(Of Object).I0
               ~~~~~~~~~~~~~~~~
BC32042: Too few type arguments to 'IT(Of Object).I0.IT(Of T)'.
    Implements IT(Of Object).I0.IT
               ~~~~~~~~~~~~~~~~~~~
BC30649: 'IT(Of T).IT.I0' is an unsupported type.
    Implements IT(Of Object).IT.I0
               ~~~~~~~~~~~~~~~~~~~
BC30649: 'IT(Of T).ITU(Of U).IT' is an unsupported type.
    Implements IT(Of Object).ITU(Of Integer).IT
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</expected>)
        End Sub
 
    End Class
 
End Namespace