From 05abe37b41a79d70e833733abb1f88fe17de5c81 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Wed, 23 Oct 2024 16:52:55 -0400 Subject: [PATCH] [generator-Tests] bind java.util.List MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context: 0aec86ac404ec6a181e635b73838f108345fed9c Commit 0aec86ac mentioned: > Remaining Integration-Tests which don't support JavaInterop1: > > * Missing builtin mapping between collection types: > > warning BG8800: Unknown parameter type 'java.util.List' for member … > warning BG8800: Unknown parameter type 'java.util.ArrayList' for member > warning BG8400: Unexpected field type `java.util.List` > > Impacts: Java_Util_List.cs, NormalMethods.cs, ParameterXPath.cs The problem here is that the provided API XML did not contain a declaration for `java.util.List`. This didn't matter for XAJavaInterop1 output, as it binds `List` as `System.Collections.Generic.IList`, but it *does* matter for JavaInterop1 output, as it doesn't special-case `List`. (Perhaps it should! Or this helps "lower" the need for improved generics! Or…) Add a declaration for `java.util.List` to Java_Util_List.cs, and ParameterXPath.cs, so that we can set `TryJavaInterop1 => true`. Also add a declaration for `java.util.List` to NormalMethods.cs. This doesn't allow us to enable `TryJavaInterop1 => true`, because of the "`Handle` isn't a public property" issue, but it'll be a necessary prerequisite to enable NormalMethods.cs in the future. --- .../Integration-Tests/Java_Util_List.cs | 2 +- .../Integration-Tests/PamareterXPath.cs | 2 +- .../NormalMethods/NormalMethods.xml | 14 ++++ .../ParameterXPath/Java.Lang.Integer.cs | 10 +++ .../ParameterXPath/Java.Lang.Object.cs | 10 +++ .../ParameterXPath/Java.Util.IList.cs | 28 +++++++ .../ParameterXPath/Mono.Android.projitems | 1 + .../ParameterXPath/ParameterXPath.xml | 9 +++ .../ParameterXPath/Xamarin.Test.A.cs | 21 ++++-- .../java.util.List/Java.Lang.Object.cs | 10 +++ .../java.util.List/Java.Util.IList.cs | 28 +++++++ .../java.util.List/Mono.Android.projitems | 1 + .../java.util.List/Xamarin.Test.SomeObject.cs | 73 ++++++++++--------- .../java.util.List/java.util.List.xml | 9 +++ .../NormalMethods/Mono.Android.projitems | 2 + .../NormalMethods/__NamespaceMapping__.cs | 1 + .../ParameterXPath/Java.Util.IList.cs | 45 ++++++++++++ .../ParameterXPath/Mono.Android.projitems | 1 + .../ParameterXPath/__NamespaceMapping__.cs | 1 + .../java.util.List/Java.Util.IList.cs | 45 ++++++++++++ .../java.util.List/Mono.Android.projitems | 1 + .../java.util.List/__NamespaceMapping__.cs | 1 + 22 files changed, 272 insertions(+), 43 deletions(-) create mode 100644 tests/generator-Tests/expected.ji/ParameterXPath/Java.Util.IList.cs create mode 100644 tests/generator-Tests/expected.ji/java.util.List/Java.Util.IList.cs create mode 100644 tests/generator-Tests/expected.xaji/ParameterXPath/Java.Util.IList.cs create mode 100644 tests/generator-Tests/expected.xaji/java.util.List/Java.Util.IList.cs diff --git a/tests/generator-Tests/Integration-Tests/Java_Util_List.cs b/tests/generator-Tests/Integration-Tests/Java_Util_List.cs index eca1ac785..19da2f51e 100644 --- a/tests/generator-Tests/Integration-Tests/Java_Util_List.cs +++ b/tests/generator-Tests/Integration-Tests/Java_Util_List.cs @@ -6,7 +6,7 @@ namespace generatortests [TestFixture] public class Java_Util_List : BaseGeneratorTest { - protected override bool TryJavaInterop1 => false; + protected override bool TryJavaInterop1 => true; [Test] public void GeneratedOK () diff --git a/tests/generator-Tests/Integration-Tests/PamareterXPath.cs b/tests/generator-Tests/Integration-Tests/PamareterXPath.cs index d590ce562..229af5e6e 100644 --- a/tests/generator-Tests/Integration-Tests/PamareterXPath.cs +++ b/tests/generator-Tests/Integration-Tests/PamareterXPath.cs @@ -6,7 +6,7 @@ namespace generatortests [TestFixture] public class ParameterXPath : BaseGeneratorTest { - protected override bool TryJavaInterop1 => false; + protected override bool TryJavaInterop1 => true; [Test] public void GeneratedOK () diff --git a/tests/generator-Tests/expected.ji/NormalMethods/NormalMethods.xml b/tests/generator-Tests/expected.ji/NormalMethods/NormalMethods.xml index 673acc976..c58efb8a9 100644 --- a/tests/generator-Tests/expected.ji/NormalMethods/NormalMethods.xml +++ b/tests/generator-Tests/expected.ji/NormalMethods/NormalMethods.xml @@ -14,6 +14,20 @@ final="false" name="Integer" static="false" visibility="public"> + + + + + + + + + + + + + + + diff --git a/tests/generator-Tests/expected.ji/java.util.List/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/java.util.List/Xamarin.Test.SomeObject.cs index db94fbb40..8b8391001 100644 --- a/tests/generator-Tests/expected.ji/java.util.List/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/java.util.List/Xamarin.Test.SomeObject.cs @@ -1,3 +1,13 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +#nullable restore using System; using System.Collections.Generic; using Java.Interop; @@ -9,147 +19,140 @@ namespace Xamarin.Test { public partial class SomeObject : global::Java.Lang.Object { // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='myStrings']" - public global::System.Collections.Generic.IList MyStrings { + public global::Java.Util.IList MyStrings { get { const string __id = "myStrings.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "myStrings.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='myInts']" - public global::System.Collections.Generic.IList MyInts { + public global::Java.Util.IList MyInts { get { const string __id = "myInts.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "myInts.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='mybools']" - public global::System.Collections.Generic.IList Mybools { + public global::Java.Util.IList Mybools { get { const string __id = "mybools.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "mybools.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='myObjects']" - public global::System.Collections.Generic.IList MyObjects { + public global::Java.Util.IList MyObjects { get { const string __id = "myObjects.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "myObjects.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='myfloats']" - public global::System.Collections.Generic.IList Myfloats { + public global::Java.Util.IList Myfloats { get { const string __id = "myfloats.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "myfloats.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='mydoubles']" - public global::System.Collections.Generic.IList Mydoubles { + public global::Java.Util.IList Mydoubles { get { const string __id = "mydoubles.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "mydoubles.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } // Metadata.xml XPath field reference: path="/api/package[@name='xamarin.test']/class[@name='SomeObject']/field[@name='mylongs']" - public global::System.Collections.Generic.IList Mylongs { + public global::Java.Util.IList Mylongs { get { const string __id = "mylongs.Ljava/util/List;"; var __v = _members.InstanceFields.GetObjectValue (__id, this); - return global::Android.Runtime.JavaList.FromJniHandle (__v.Handle, JniHandleOwnership.TransferLocalRef); + return global::Java.Interop.JniEnvironment.Runtime.ValueManager.GetValue(ref __v, JniObjectReferenceOptions.Copy); } set { const string __id = "mylongs.Ljava/util/List;"; - IntPtr native_value = global::Android.Runtime.JavaList.ToLocalJniHandle (value); try { - _members.InstanceFields.SetValue (__id, this, new JniObjectReference (native_value)); + _members.InstanceFields.SetValue (__id, this, value?.PeerReference ?? default); } finally { - JNIEnv.DeleteLocalRef (native_value); + GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/java.util.List/java.util.List.xml b/tests/generator-Tests/expected.ji/java.util.List/java.util.List.xml index 03dbcc187..57c35adbb 100644 --- a/tests/generator-Tests/expected.ji/java.util.List/java.util.List.xml +++ b/tests/generator-Tests/expected.ji/java.util.List/java.util.List.xml @@ -4,6 +4,15 @@ + + + + + + + + + diff --git a/tests/generator-Tests/expected.xaji/NormalMethods/Mono.Android.projitems b/tests/generator-Tests/expected.xaji/NormalMethods/Mono.Android.projitems index 98ca90f0d..444ae55b7 100644 --- a/tests/generator-Tests/expected.xaji/NormalMethods/Mono.Android.projitems +++ b/tests/generator-Tests/expected.xaji/NormalMethods/Mono.Android.projitems @@ -10,6 +10,8 @@ + + diff --git a/tests/generator-Tests/expected.xaji/NormalMethods/__NamespaceMapping__.cs b/tests/generator-Tests/expected.xaji/NormalMethods/__NamespaceMapping__.cs index 7fe4a370f..871315e91 100644 --- a/tests/generator-Tests/expected.xaji/NormalMethods/__NamespaceMapping__.cs +++ b/tests/generator-Tests/expected.xaji/NormalMethods/__NamespaceMapping__.cs @@ -1,6 +1,7 @@ using System; [assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")] +[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.util", Managed="Java.Util")] [assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")] delegate int _JniMarshal_PP_I (IntPtr jnienv, IntPtr klass); diff --git a/tests/generator-Tests/expected.xaji/ParameterXPath/Java.Util.IList.cs b/tests/generator-Tests/expected.xaji/ParameterXPath/Java.Util.IList.cs new file mode 100644 index 000000000..039257aa5 --- /dev/null +++ b/tests/generator-Tests/expected.xaji/ParameterXPath/Java.Util.IList.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Android.Runtime; +using Java.Interop; + +namespace Java.Util { + + // Metadata.xml XPath interface reference: path="/api/package[@name='java.util']/interface[@name='List']" + [Register ("java/util/List", "", "Java.Util.IListInvoker")] + [global::Java.Interop.JavaTypeParameters (new string [] {"E"})] + public partial interface IList : IJavaObject, IJavaPeerable { + } + + [global::Android.Runtime.Register ("java/util/List", DoNotGenerateAcw=true)] + internal partial class IListInvoker : global::Java.Lang.Object, IList { + static IntPtr java_class_ref { + get { return _members_java_util_List.JniPeerType.PeerReference.Handle; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + public override global::Java.Interop.JniPeerMembers JniPeerMembers { + get { return _members_java_util_List; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + protected override IntPtr ThresholdClass { + get { return _members_java_util_List.JniPeerType.PeerReference.Handle; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + protected override global::System.Type ThresholdType { + get { return _members_java_util_List.ManagedPeerType; } + } + + static readonly JniPeerMembers _members_java_util_List = new XAPeerMembers ("java/util/List", typeof (IListInvoker)); + + public IListInvoker (IntPtr handle, JniHandleOwnership transfer) : base (handle, transfer) + { + } + + } +} diff --git a/tests/generator-Tests/expected.xaji/ParameterXPath/Mono.Android.projitems b/tests/generator-Tests/expected.xaji/ParameterXPath/Mono.Android.projitems index e6f21d31f..f3892ce4c 100644 --- a/tests/generator-Tests/expected.xaji/ParameterXPath/Mono.Android.projitems +++ b/tests/generator-Tests/expected.xaji/ParameterXPath/Mono.Android.projitems @@ -8,6 +8,7 @@ + diff --git a/tests/generator-Tests/expected.xaji/ParameterXPath/__NamespaceMapping__.cs b/tests/generator-Tests/expected.xaji/ParameterXPath/__NamespaceMapping__.cs index 3f42b984d..98846fdfd 100644 --- a/tests/generator-Tests/expected.xaji/ParameterXPath/__NamespaceMapping__.cs +++ b/tests/generator-Tests/expected.xaji/ParameterXPath/__NamespaceMapping__.cs @@ -1,6 +1,7 @@ using System; [assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")] +[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.util", Managed="Java.Util")] [assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")] delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0); diff --git a/tests/generator-Tests/expected.xaji/java.util.List/Java.Util.IList.cs b/tests/generator-Tests/expected.xaji/java.util.List/Java.Util.IList.cs new file mode 100644 index 000000000..039257aa5 --- /dev/null +++ b/tests/generator-Tests/expected.xaji/java.util.List/Java.Util.IList.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Android.Runtime; +using Java.Interop; + +namespace Java.Util { + + // Metadata.xml XPath interface reference: path="/api/package[@name='java.util']/interface[@name='List']" + [Register ("java/util/List", "", "Java.Util.IListInvoker")] + [global::Java.Interop.JavaTypeParameters (new string [] {"E"})] + public partial interface IList : IJavaObject, IJavaPeerable { + } + + [global::Android.Runtime.Register ("java/util/List", DoNotGenerateAcw=true)] + internal partial class IListInvoker : global::Java.Lang.Object, IList { + static IntPtr java_class_ref { + get { return _members_java_util_List.JniPeerType.PeerReference.Handle; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + public override global::Java.Interop.JniPeerMembers JniPeerMembers { + get { return _members_java_util_List; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + protected override IntPtr ThresholdClass { + get { return _members_java_util_List.JniPeerType.PeerReference.Handle; } + } + + [global::System.Diagnostics.DebuggerBrowsable (global::System.Diagnostics.DebuggerBrowsableState.Never)] + [global::System.ComponentModel.EditorBrowsable (global::System.ComponentModel.EditorBrowsableState.Never)] + protected override global::System.Type ThresholdType { + get { return _members_java_util_List.ManagedPeerType; } + } + + static readonly JniPeerMembers _members_java_util_List = new XAPeerMembers ("java/util/List", typeof (IListInvoker)); + + public IListInvoker (IntPtr handle, JniHandleOwnership transfer) : base (handle, transfer) + { + } + + } +} diff --git a/tests/generator-Tests/expected.xaji/java.util.List/Mono.Android.projitems b/tests/generator-Tests/expected.xaji/java.util.List/Mono.Android.projitems index 066be1dd1..3b4c7eb77 100644 --- a/tests/generator-Tests/expected.xaji/java.util.List/Mono.Android.projitems +++ b/tests/generator-Tests/expected.xaji/java.util.List/Mono.Android.projitems @@ -7,6 +7,7 @@ + diff --git a/tests/generator-Tests/expected.xaji/java.util.List/__NamespaceMapping__.cs b/tests/generator-Tests/expected.xaji/java.util.List/__NamespaceMapping__.cs index 9fa410728..98648e98a 100644 --- a/tests/generator-Tests/expected.xaji/java.util.List/__NamespaceMapping__.cs +++ b/tests/generator-Tests/expected.xaji/java.util.List/__NamespaceMapping__.cs @@ -1,6 +1,7 @@ using System; [assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")] +[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.util", Managed="Java.Util")] [assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")] #if !NET