Skip to content

Commit b9393d2

Browse files
committed
[JavaTypeSystem] Enable resolving generic types on declaring types.
1 parent a8b444d commit b9393d2

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

src/Java.Interop.Tools.JavaTypeSystem/JavaModels/JavaTypeModel.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,9 @@ public IEnumerable<JavaTypeParameter> GetApplicableTypeParameters ()
106106
foreach (var jtp in TypeParameters)
107107
yield return jtp;
108108

109-
yield break;
110-
111-
// TODO, this is more correct, but disabled for ApiXmlAdjuster compatibility.
112-
// https://github.com/xamarin/java.interop/issues/815
113-
//if (DeclaringType != null)
114-
// foreach (var jtp in DeclaringType.GetApplicableTypeParameters ())
115-
// yield return jtp;
109+
if (DeclaringType != null)
110+
foreach (var jtp in DeclaringType.GetApplicableTypeParameters ())
111+
yield return jtp;
116112
}
117113
}
118114
}

tests/Java.Interop.Tools.JavaTypeSystem-Tests/Java.Interop.Tools.JavaTypeSystem-Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net472</TargetFramework>
4+
<TargetFrameworks>net472;net6.0</TargetFrameworks>
55
<IsPackable>false</IsPackable>
66
<RootNamespace>Java.Interop.Tools.JavaTypeSystem.Tests</RootNamespace>
77
</PropertyGroup>

tests/Java.Interop.Tools.JavaTypeSystem-Tests/JavaTypeCollectionTests.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)