@@ -357,6 +357,12 @@ @interface NSObject
357357@interface MyClass<T, Y> (MyCategory)
358358@end
359359
360+ @interface MyVariantClass<__contravariant T, __covariant U, V> : NSObject
361+ @end
362+
363+ @interface MyBoundedClass<T : NSObject*> : NSObject
364+ @end
365+
360366""" ;
361367 using var translationUnit = CreateTranslationUnit ( inputContents , "objective-c++" ) ;
362368
@@ -368,7 +374,11 @@ @interface MyClass<T, Y> (MyCategory)
368374 var myClassTypeParams = myClass . TypeParamList . ToList ( ) ;
369375 Assert . That ( myClassTypeParams . Count , Is . EqualTo ( 2 ) , "myClassTypeParams.Count" ) ;
370376 Assert . That ( myClassTypeParams [ 0 ] . Name , Is . EqualTo ( "A" ) , "myClassTypeParams[0].Name" ) ;
377+ Assert . That ( myClassTypeParams [ 0 ] . HasExplicitBound , Is . EqualTo ( false ) , "myClassTypeParams[0].HasExplicitBound" ) ;
378+ Assert . That ( myClassTypeParams [ 0 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myClassTypeParams[0].Variance" ) ;
371379 Assert . That ( myClassTypeParams [ 1 ] . Name , Is . EqualTo ( "B" ) , "myClassTypeParams[1].Name" ) ;
380+ Assert . That ( myClassTypeParams [ 1 ] . HasExplicitBound , Is . EqualTo ( false ) , "myClassTypeParams[1].HasExplicitBound" ) ;
381+ Assert . That ( myClassTypeParams [ 1 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myClassTypeParams[1].Variance" ) ;
372382
373383 var categories = translationUnit . TranslationUnitDecl . Decls . OfType < ObjCCategoryDecl > ( ) . ToList ( ) ;
374384 var myCategory = categories . SingleOrDefault ( v => v . Name == "MyCategory" ) ! ;
@@ -377,7 +387,35 @@ @interface MyClass<T, Y> (MyCategory)
377387 var myCategoryTypeParams = myCategory . TypeParamList . ToList ( ) ;
378388 Assert . That ( myCategoryTypeParams . Count , Is . EqualTo ( 2 ) , "myCategoryTypeParams.Count" ) ;
379389 Assert . That ( myCategoryTypeParams [ 0 ] . Name , Is . EqualTo ( "T" ) , "myCategoryTypeParams[0].Name" ) ;
390+ Assert . That ( myCategoryTypeParams [ 0 ] . HasExplicitBound , Is . EqualTo ( false ) , "myCategoryTypeParams[0].HasExplicitBound" ) ;
391+ Assert . That ( myCategoryTypeParams [ 0 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myCategoryTypeParams[0].Variance" ) ;
380392 Assert . That ( myCategoryTypeParams [ 1 ] . Name , Is . EqualTo ( "Y" ) , "myCategoryTypeParams[1].Name" ) ;
393+ Assert . That ( myCategoryTypeParams [ 1 ] . HasExplicitBound , Is . EqualTo ( false ) , "myCategoryTypeParams[1].HasExplicitBound" ) ;
394+ Assert . That ( myCategoryTypeParams [ 1 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myCategoryTypeParams[1].Variance" ) ;
395+
396+ var myVariantClass = classes . SingleOrDefault ( v => v . Name == "MyVariantClass" ) ! ;
397+ Assert . That ( myVariantClass , Is . Not . Null , "MyVariantClass" ) ;
398+ Assert . That ( myVariantClass . TypeParamList , Is . Not . Null , "myVariantClass TypeParamList" ) ;
399+ var myVariantClassTypeParams = myVariantClass . TypeParamList . ToList ( ) ;
400+ Assert . That ( myVariantClassTypeParams . Count , Is . EqualTo ( 3 ) , "myVariantClassTypeParams.Count" ) ;
401+ Assert . That ( myVariantClassTypeParams [ 0 ] . Name , Is . EqualTo ( "T" ) , "myVariantClassTypeParams[0].Name" ) ;
402+ Assert . That ( myVariantClassTypeParams [ 1 ] . Name , Is . EqualTo ( "U" ) , "myVariantClassTypeParams[1].Name" ) ;
403+ Assert . That ( myVariantClassTypeParams [ 2 ] . Name , Is . EqualTo ( "V" ) , "myVariantClassTypeParams[2].Name" ) ;
404+ Assert . That ( myVariantClassTypeParams [ 0 ] . HasExplicitBound , Is . EqualTo ( false ) , "myVariantClassTypeParams[0].HasExplicitBound" ) ;
405+ Assert . That ( myVariantClassTypeParams [ 1 ] . HasExplicitBound , Is . EqualTo ( false ) , "myVariantClassTypeParams[1].HasExplicitBound" ) ;
406+ Assert . That ( myVariantClassTypeParams [ 2 ] . HasExplicitBound , Is . EqualTo ( false ) , "myBoundedClassTypeParams[2].HasExplicitBound" ) ;
407+ Assert . That ( myVariantClassTypeParams [ 0 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Contravariant ) , "myVariantClassTypeParams[0].Variance" ) ;
408+ Assert . That ( myVariantClassTypeParams [ 1 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Covariant ) , "myVariantClassTypeParams[1].Variance" ) ;
409+ Assert . That ( myVariantClassTypeParams [ 2 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myVariantClassTypeParams[2].Variance" ) ;
410+
411+ var myBoundedClass = classes . SingleOrDefault ( v => v . Name == "MyBoundedClass" ) ! ;
412+ Assert . That ( myBoundedClass , Is . Not . Null , "MyBoundedClass" ) ;
413+ Assert . That ( myBoundedClass . TypeParamList , Is . Not . Null , "myBoundedClass TypeParamList" ) ;
414+ var myBoundedClassTypeParams = myBoundedClass . TypeParamList . ToList ( ) ;
415+ Assert . That ( myBoundedClassTypeParams . Count , Is . EqualTo ( 1 ) , "myBoundedClassTypeParams.Count" ) ;
416+ Assert . That ( myBoundedClassTypeParams [ 0 ] . Name , Is . EqualTo ( "T" ) , "myBoundedClassTypeParams[0].Name" ) ;
417+ Assert . That ( myBoundedClassTypeParams [ 0 ] . HasExplicitBound , Is . EqualTo ( true ) , "myBoundedClassTypeParams[0].HasExplicitBound" ) ;
418+ Assert . That ( myBoundedClassTypeParams [ 0 ] . Variance , Is . EqualTo ( ObjCTypeParamVariance . Invariant ) , "myBoundedClassTypeParams[0].Variance" ) ;
381419 }
382420
383421 [ Test ]
0 commit comments