From 08dc05e7302f6ae06df7470ef5d7af5157181322 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Thu, 21 May 2026 14:25:19 +0200 Subject: [PATCH] Propagate GetObject constructor annotations Annotate the GetObject generic type parameters and Type argument so constructor DAM requirements flow through to JniValueManager.GetPeer(). Remove the local UnconditionalSuppressMessage helper now that the requirement is represented at the call sites. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/Mono.Android/Java.Lang/Object.cs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Mono.Android/Java.Lang/Object.cs b/src/Mono.Android/Java.Lang/Object.cs index 814d4c3b277..0942d917e57 100644 --- a/src/Mono.Android/Java.Lang/Object.cs +++ b/src/Mono.Android/Java.Lang/Object.cs @@ -141,20 +141,29 @@ static JniObjectReferenceOptions FromJniHandleOwnership (JniHandleOwnership tran return (T?)PeekObject (handle, typeof (T)); } - public static T? GetObject (IntPtr jnienv, IntPtr handle, JniHandleOwnership transfer) + public static T? GetObject< + [DynamicallyAccessedMembers (Constructors)] + T + > (IntPtr jnienv, IntPtr handle, JniHandleOwnership transfer) where T : class, IJavaObject { JNIEnv.CheckHandle (jnienv); return GetObject (handle, transfer); } - public static T? GetObject (IntPtr handle, JniHandleOwnership transfer) + public static T? GetObject< + [DynamicallyAccessedMembers (Constructors)] + T + > (IntPtr handle, JniHandleOwnership transfer) where T : class, IJavaObject { - return _GetObject(handle, transfer); + return _GetObject (handle, transfer); } - internal static T? _GetObject (IntPtr handle, JniHandleOwnership transfer) + internal static T? _GetObject< + [DynamicallyAccessedMembers (Constructors)] + T + > (IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) return default (T); @@ -165,19 +174,15 @@ static JniObjectReferenceOptions FromJniHandleOwnership (JniHandleOwnership tran internal static IJavaPeerable? GetObject ( IntPtr handle, JniHandleOwnership transfer, + [DynamicallyAccessedMembers (Constructors)] Type? type = null) { if (handle == IntPtr.Zero) return null; - var r = GetPeer (handle, type); + var r = JniEnvironment.Runtime.ValueManager.GetPeer (new JniObjectReference (handle), type); JNIEnv.DeleteRef (handle, transfer); return r; - - // FIXME: should use [DynamicallyAccessedMembers (Constructors)] in the future - [UnconditionalSuppressMessage ("Trimming", "IL2067:'targetType' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicConstructors', 'DynamicallyAccessedMemberTypes.NonPublicConstructors' in call to 'Java.Interop.JniRuntime.JniValueManager.GetPeer(JniObjectReference, Type)'.", Justification = "The MarkJavaObjects step preserves ctors on Java.Lang.Object subclasses.")] - static IJavaPeerable? GetPeer (IntPtr handle, Type? type) => - JniEnvironment.Runtime.ValueManager.GetPeer (new JniObjectReference (handle), type); } [EditorBrowsable (EditorBrowsableState.Never)]