@@ -73,5 +73,54 @@ public void IntentServiceHack ()
7373 Assert . AreSame ( new_intent_service , api . FindType ( "mono.android.app.IntentService" ) ) ;
7474 Assert . AreSame ( new_intent_service , api . FindType ( "android.app.IntentService" ) ) ;
7575 }
76+
77+ [ Test ]
78+ public void InheritedGenericTypeParameters ( )
79+ {
80+ // Ensure we can resolve generic type parameters from parent types:
81+ // public class MyClass<T>
82+ // {
83+ // public class MyNestedClass<U>
84+ // {
85+ // public void DoT (T value) { }
86+ // public void DoU (U value) { }
87+ // }
88+ // }
89+ var xml = @"
90+ <api api-source='class-parse'>
91+ <package name='example' jni-name='example'>
92+ <class abstract='false' deprecated='not deprecated' jni-extends='Ljava/lang/Object;' extends='java.lang.Object' extends-generic-aware='java.lang.Object' final='false' name='MyClass' jni-signature='Lexample/MyClass;' source-file-name='MyClass.java' static='false' visibility='public'>
93+ <typeParameters>
94+ <typeParameter name='T' jni-classBound='Ljava/lang/Object;' classBound='java.lang.Object' interfaceBounds='' jni-interfaceBounds='' />
95+ </typeParameters>
96+ <constructor deprecated='not deprecated' final='false' name='MyClass' static='false' visibility='public' bridge='false' synthetic='false' jni-signature='()V' />
97+ </class>
98+ <class abstract='false' deprecated='not deprecated' jni-extends='Ljava/lang/Object;' extends='java.lang.Object' extends-generic-aware='java.lang.Object' final='false' name='MyClass.MyNestedClass' jni-signature='Lexample/MyClass$MyNestedClass;' source-file-name='MyClass.java' static='false' visibility='public'>
99+ <typeParameters>
100+ <typeParameter name='U' jni-classBound='Ljava/lang/Object;' classBound='java.lang.Object' interfaceBounds='' jni-interfaceBounds='' />
101+ </typeParameters>
102+ <constructor deprecated='not deprecated' final='false' name='MyClass.MyNestedClass' static='false' visibility='public' bridge='false' synthetic='false' jni-signature='(Lexample/MyClass;)V' />
103+ <method abstract='false' deprecated='not deprecated' final='false' name='DoT' native='false' return='void' jni-return='V' static='false' synchronized='false' visibility='public' bridge='false' synthetic='false' jni-signature='(Ljava/lang/Object;)V'>
104+ <parameter name='p0' type='T' jni-type='TT;' />
105+ </method>
106+ <method abstract='false' deprecated='not deprecated' final='false' name='DoU' native='false' return='void' jni-return='V' static='false' synchronized='false' visibility='public' bridge='false' synthetic='false' jni-signature='(Ljava/lang/Object;)V'>
107+ <parameter name='p0' type='U' jni-type='TU;' />
108+ </method>
109+ </class>
110+ </package>
111+ </api>" ;
112+
113+ var xapi = JavaApiTestHelper . GetLoadedApi ( ) ;
114+ JavaXmlApiImporter . ParseString ( xml , xapi ) ;
115+
116+ var results = xapi . ResolveCollection ( ) ;
117+
118+ var t = xapi . Packages [ "example" ] . Types . First ( _ => _ . Name == "MyClass" ) . NestedTypes . First ( _ => _ . Name == "MyNestedClass" ) as JavaClassModel ;
119+
120+ Assert . AreEqual ( 2 , t . Methods . Count ) ;
121+
122+ Assert . IsNotNull ( t . Methods . SingleOrDefault ( m => m . Name == "DoT" ) , "Method with generic T not found" ) ;
123+ Assert . IsNotNull ( t . Methods . SingleOrDefault ( m => m . Name == "DoU" ) , "Method with generic U not found" ) ;
124+ }
76125 }
77126}
0 commit comments