From 02bfa6e85b09edd362a689570008ec9bb26776e1 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 18 Dec 2024 11:35:25 -0600 Subject: [PATCH 1/3] [Java.Interop] remove `DynamicallyAccessedMemberTypes.Interfaces` Context: https://github.com/dotnet/android/pull/9630 As #9630 required new declarations of `DynamicallyAccessedMemberTypes.Interfaces`, we intestigated to see *why* these were needed in Java.Interop. There are two cases: var listIface = typeof (IList<>); var listType = (from iface in type.GetInterfaces ().Concat (new[]{type}) where (listIface).IsAssignableFrom (iface.IsGenericType ? iface.GetGenericTypeDefinition () : iface) select iface) .FirstOrDefault (); This first one, if `IList<>` were trimmed away. We don't actually care, as everything in this code path would still work. We can suppress the warning instead. The second case: JniValueMarshalerAttribute? ifaceAttribute = null; foreach (var iface in type.GetInterfaces ()) { marshalerAttr = iface.GetCustomAttribute (); if (marshalerAttr != null) { if (ifaceAttribute != null) throw new NotSupportedException ($"There is more than one interface with custom marshaler for type {type}."); ifaceAttribute = marshalerAttr; } } if (ifaceAttribute != null) return (JniValueMarshaler) Activator.CreateInstance (ifaceAttribute.MarshalerType)!; Feels like we should be able to remove this code completely. With these changes we can remove `DynamicallyAccessedMemberTypes.Interfaces`. I also introduced `build-tools/trim-analyzers/trim-analyzers.props` that will setup the appropriate trimmer MSBuild properties to make trimmer warnings an error. This should keep us from accidentally creating warnings. I only use this setting in projects that were already using `$(EnableAotAnalyzer)`. --- .../trim-analyzers/trim-analyzers.props | 55 ++++++++++++++++ ...Java.Interop.Tools.TypeNameMappings.csproj | 4 +- src/Java.Interop/Java.Interop.csproj | 4 +- src/Java.Interop/Java.Interop/JavaArray.cs | 2 +- src/Java.Interop/Java.Interop/JavaObject.cs | 1 - .../Java.Interop/JavaObjectArray.cs | 6 +- .../Java.Interop/JavaPrimitiveArrays.cs | 32 ++++----- .../Java.Interop/JniBuiltinMarshalers.cs | 48 +++++++------- .../JniRuntime.JniMarshalMemberBuilder.cs | 4 +- .../JniRuntime.JniValueManager.cs | 65 +++++++++---------- .../Java.Interop/JniStringValueMarshaler.cs | 2 +- .../Java.Interop/JniValueMarshaler.cs | 12 ++-- 12 files changed, 139 insertions(+), 96 deletions(-) create mode 100644 build-tools/trim-analyzers/trim-analyzers.props diff --git a/build-tools/trim-analyzers/trim-analyzers.props b/build-tools/trim-analyzers/trim-analyzers.props new file mode 100644 index 000000000..a61c10aa7 --- /dev/null +++ b/build-tools/trim-analyzers/trim-analyzers.props @@ -0,0 +1,55 @@ + + + + + true + true + true + + true + + + $(WarningsAsErrors); + IL2000;IL2001;IL2002;IL2003;IL2004; + IL2005;IL2006;IL2007;IL2008;IL2009; + IL2010;IL2011;IL2012;IL2013;IL2014; + IL2015;IL2016;IL2017;IL2018;IL2019; + IL2020;IL2021;IL2022;IL2023;IL2024; + IL2025;IL2026;IL2027;IL2028;IL2029; + IL2030;IL2031;IL2032;IL2033;IL2034; + IL2035;IL2036;IL2037;IL2038;IL2039; + IL2040;IL2041;IL2042;IL2043;IL2044; + IL2045;IL2046;IL2047;IL2048;IL2049; + IL2050;IL2051;IL2052;IL2053;IL2054; + IL2055;IL2056;IL2057;IL2058;IL2059; + IL2060;IL2061;IL2062;IL2063;IL2064; + IL2065;IL2066;IL2067;IL2068;IL2069; + IL2070;IL2071;IL2072;IL2073;IL2074; + IL2075;IL2076;IL2077;IL2078;IL2079; + IL2080;IL2081;IL2082;IL2083;IL2084; + IL2085;IL2086;IL2087;IL2088;IL2089; + IL2090;IL2091;IL2092;IL2093;IL2094; + IL2095;IL2096;IL2097;IL2098;IL2099; + IL2100;IL2101;IL2102;IL2103;IL2104; + IL2105;IL2106;IL2107;IL2108;IL2109; + IL2110;IL2111;IL2112;IL2113;IL2114; + IL2115;IL2116;IL2117;IL2118;IL2119; + IL2120;IL2121;IL2122;IL2123;IL2124; + IL2125;IL2126;IL2127;IL2128;IL2129; + + + true + + + $(WarningsAsErrors); + IL3050;IL3051;IL3052;IL3053;IL3054;IL3055;IL3056; + + + \ No newline at end of file diff --git a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings.csproj b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings.csproj index aec1edf4b..b5a852d65 100644 --- a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings.csproj +++ b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings.csproj @@ -3,13 +3,11 @@ $(DotNetTargetFramework) enable true - true - true - true $(DefineConstants);JCW_ONLY_TYPE_NAMES;HAVE_CECIL + diff --git a/src/Java.Interop/Java.Interop.csproj b/src/Java.Interop/Java.Interop.csproj index 1c4f0c681..127fc3288 100644 --- a/src/Java.Interop/Java.Interop.csproj +++ b/src/Java.Interop/Java.Interop.csproj @@ -14,15 +14,13 @@ true enable true - true - true - true NU1702 DEBUG;$(DefineConstants) + INTEROP;FEATURE_JNIOBJECTREFERENCE_INTPTRS;$(JavaInteropDefineConstants) $(BaseIntermediateOutputPath)$(Configuration)\$(TargetFramework.ToLowerInvariant())\ diff --git a/src/Java.Interop/Java.Interop/JavaArray.cs b/src/Java.Interop/Java.Interop/JavaArray.cs index 7b6889f25..4261b0836 100644 --- a/src/Java.Interop/Java.Interop/JavaArray.cs +++ b/src/Java.Interop/Java.Interop/JavaArray.cs @@ -363,7 +363,7 @@ public void Dispose () } public abstract class JavaPrimitiveArray< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > : JavaArray diff --git a/src/Java.Interop/Java.Interop/JavaObject.cs b/src/Java.Interop/Java.Interop/JavaObject.cs index 3b84bd0ef..22e382fba 100644 --- a/src/Java.Interop/Java.Interop/JavaObject.cs +++ b/src/Java.Interop/Java.Interop/JavaObject.cs @@ -9,7 +9,6 @@ namespace Java.Interop unsafe public class JavaObject : IJavaPeerable { internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; - internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = Constructors | DynamicallyAccessedMemberTypes.Interfaces; readonly static JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (JavaObject)); diff --git a/src/Java.Interop/Java.Interop/JavaObjectArray.cs b/src/Java.Interop/Java.Interop/JavaObjectArray.cs index a9f960ef2..0125fcfe8 100644 --- a/src/Java.Interop/Java.Interop/JavaObjectArray.cs +++ b/src/Java.Interop/Java.Interop/JavaObjectArray.cs @@ -8,7 +8,7 @@ namespace Java.Interop { public class JavaObjectArray< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > : JavaArray @@ -171,7 +171,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue (ref reference, options, targetType, (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaObjectArray (ref h, t) { @@ -203,7 +203,7 @@ partial class JniEnvironment { partial class Arrays { public static JavaObjectArray? CreateMarshalObjectArray< - [DynamicallyAccessedMembers (JavaObject.ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (JavaObject.Constructors)] T > ( IEnumerable? value) diff --git a/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs b/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs index bf9d60f04..dad9743ed 100644 --- a/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs +++ b/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs @@ -246,7 +246,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -257,7 +257,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -450,7 +450,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -461,7 +461,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -654,7 +654,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -665,7 +665,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -858,7 +858,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -869,7 +869,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -1062,7 +1062,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -1073,7 +1073,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -1266,7 +1266,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -1277,7 +1277,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -1470,7 +1470,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -1481,7 +1481,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( @@ -1674,7 +1674,7 @@ internal override bool TargetTypeIsCurrentType (Type? targetType) public static object? CreateMarshaledValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return ArrayMarshaler.CreateValue (handle, targetType); @@ -1685,7 +1685,7 @@ internal sealed class ValueMarshaler : JniValueMarshaler> { public override IList CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JavaArray.CreateValue ( diff --git a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs index 758941fe7..3ab2744cc 100644 --- a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs +++ b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs @@ -226,7 +226,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -237,7 +237,7 @@ public override Type MarshalType { public override Boolean CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -299,7 +299,7 @@ sealed class JniNullableBooleanValueMarshaler : JniValueMarshaler { public override Boolean? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -370,7 +370,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -381,7 +381,7 @@ public override Type MarshalType { public override SByte CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -443,7 +443,7 @@ sealed class JniNullableSByteValueMarshaler : JniValueMarshaler { public override SByte? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -514,7 +514,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -525,7 +525,7 @@ public override Type MarshalType { public override Char CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -587,7 +587,7 @@ sealed class JniNullableCharValueMarshaler : JniValueMarshaler { public override Char? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -658,7 +658,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -669,7 +669,7 @@ public override Type MarshalType { public override Int16 CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -731,7 +731,7 @@ sealed class JniNullableInt16ValueMarshaler : JniValueMarshaler { public override Int16? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -802,7 +802,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -813,7 +813,7 @@ public override Type MarshalType { public override Int32 CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -875,7 +875,7 @@ sealed class JniNullableInt32ValueMarshaler : JniValueMarshaler { public override Int32? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -946,7 +946,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -957,7 +957,7 @@ public override Type MarshalType { public override Int64 CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1019,7 +1019,7 @@ sealed class JniNullableInt64ValueMarshaler : JniValueMarshaler { public override Int64? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1090,7 +1090,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1101,7 +1101,7 @@ public override Type MarshalType { public override Single CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1163,7 +1163,7 @@ sealed class JniNullableSingleValueMarshaler : JniValueMarshaler { public override Single? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1234,7 +1234,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1245,7 +1245,7 @@ public override Type MarshalType { public override Double CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) @@ -1307,7 +1307,7 @@ sealed class JniNullableDoubleValueMarshaler : JniValueMarshaler { public override Double? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { if (!reference.IsValid) diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs index 6eb904ad1..b04bd1f34 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs @@ -200,7 +200,7 @@ public override Expression CreateReturnValueFromManagedExpression (Java.Interop. public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { throw new NotSupportedException (); @@ -209,7 +209,7 @@ public override Expression CreateReturnValueFromManagedExpression (Java.Interop. public override IntPtr CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { throw new NotSupportedException (); diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs index f1cfe3d9d..10c91f1e1 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs @@ -50,7 +50,6 @@ partial void SetValueManager (CreationOptions options) public abstract partial class JniValueManager : ISetRuntime, IDisposable { internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; - internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = Constructors | DynamicallyAccessedMemberTypes.Interfaces; JniRuntime? runtime; bool disposed; @@ -415,7 +414,7 @@ static Type MakeGenericType ( public object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null) { if (disposed) @@ -447,12 +446,12 @@ static Type MakeGenericType ( [return: MaybeNull] public T CreateValue< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null) { if (disposed) @@ -490,7 +489,7 @@ public T CreateValue< return marshaler.CreateGenericValue (ref reference, options, targetType); } - [return: DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [return: DynamicallyAccessedMembers (Constructors)] internal Type? GetRuntimeType (JniObjectReference reference) { if (!reference.IsValid) @@ -504,7 +503,7 @@ public T CreateValue< public object? GetValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null) { if (disposed) @@ -534,7 +533,7 @@ public T CreateValue< [return: MaybeNull] public T GetValue< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > ( IntPtr handle) @@ -545,12 +544,12 @@ public T GetValue< [return: MaybeNull] public T GetValue< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null) { if (!reference.IsValid) { @@ -588,7 +587,7 @@ public T GetValue< Dictionary Marshalers = new Dictionary (); public JniValueMarshaler GetValueMarshaler< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > () { @@ -606,9 +605,7 @@ public JniValueMarshaler GetValueMarshaler< } } - public JniValueMarshaler GetValueMarshaler ( - [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.Interfaces)] - Type type) + public JniValueMarshaler GetValueMarshaler (Type type) { if (disposed) throw new ObjectDisposedException (GetType ().Name); @@ -633,12 +630,8 @@ public JniValueMarshaler GetValueMarshaler ( return marshaler.Value; } - var listIface = typeof (IList<>); - var listType = - (from iface in type.GetInterfaces ().Concat (new[]{type}) - where (listIface).IsAssignableFrom (iface.IsGenericType ? iface.GetGenericTypeDefinition () : iface) - select iface) - .FirstOrDefault (); + + var listType = GetListType (type); if (listType != null) { var elementType = listType.GenericTypeArguments [0]; if (elementType.IsValueType) { @@ -655,20 +648,20 @@ public JniValueMarshaler GetValueMarshaler ( return JavaPeerableValueMarshaler.Instance; } - JniValueMarshalerAttribute? ifaceAttribute = null; - foreach (var iface in type.GetInterfaces ()) { - marshalerAttr = iface.GetCustomAttribute (); - if (marshalerAttr != null) { - if (ifaceAttribute != null) - throw new NotSupportedException ($"There is more than one interface with custom marshaler for type {type}."); + return GetValueMarshalerCore (type); + } - ifaceAttribute = marshalerAttr; - } + static Type? GetListType(Type type) + { + foreach (var iface in GetInterfaces (type).Concat (new [] { type })) { + if (typeof (IList<>).IsAssignableFrom (iface.IsGenericType ? iface.GetGenericTypeDefinition () : iface)) + return iface; } - if (ifaceAttribute != null) - return (JniValueMarshaler) Activator.CreateInstance (ifaceAttribute.MarshalerType)!; + return null; - return GetValueMarshalerCore (type); + [UnconditionalSuppressMessage ("Trimming", "IL2070", Justification = "We handle the case if IList<> is trimmed away")] + static Type [] GetInterfaces (Type type) => + type.GetInterfaces (); } static JniValueMarshaler GetObjectArrayMarshaler (Type elementType) @@ -690,7 +683,7 @@ static MethodInfo MakeGenericMethod (MethodInfo method, Type type) => } static JniValueMarshaler GetObjectArrayMarshalerHelper< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > () { @@ -715,7 +708,7 @@ public override Type MarshalType { public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { throw new NotSupportedException (); @@ -740,7 +733,7 @@ sealed class JavaPeerableValueMarshaler : JniValueMarshaler { public override IJavaPeerable? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { var jvm = JniEnvironment.Runtime; @@ -817,7 +810,7 @@ public override Expression CreateParameterToManagedExpression (JniValueMarshaler } sealed class DelegatingValueMarshaler< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > : JniValueMarshaler @@ -834,7 +827,7 @@ public DelegatingValueMarshaler (JniValueMarshaler valueMarshaler) public override T CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return (T) ValueMarshaler.CreateValue (ref reference, options, targetType ?? typeof (T))!; @@ -879,7 +872,7 @@ sealed class ProxyValueMarshaler : JniValueMarshaler { public override object? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { var jvm = JniEnvironment.Runtime; diff --git a/src/Java.Interop/Java.Interop/JniStringValueMarshaler.cs b/src/Java.Interop/Java.Interop/JniStringValueMarshaler.cs index f5f06caff..31e081590 100644 --- a/src/Java.Interop/Java.Interop/JniStringValueMarshaler.cs +++ b/src/Java.Interop/Java.Interop/JniStringValueMarshaler.cs @@ -17,7 +17,7 @@ sealed class JniStringValueMarshaler : JniValueMarshaler { public override string? CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { return JniEnvironment.Strings.ToString (ref reference, options, targetType ?? typeof (string)); diff --git a/src/Java.Interop/Java.Interop/JniValueMarshaler.cs b/src/Java.Interop/Java.Interop/JniValueMarshaler.cs index b45bef89c..4238108f9 100644 --- a/src/Java.Interop/Java.Interop/JniValueMarshaler.cs +++ b/src/Java.Interop/Java.Interop/JniValueMarshaler.cs @@ -120,7 +120,7 @@ public override string ToString () public abstract class JniValueMarshaler { - internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces; + internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; internal const string ExpressionRequiresUnreferencedCode = "System.Linq.Expression usage may trim away required code."; public virtual bool IsJniValueType { @@ -135,7 +135,7 @@ public virtual Type MarshalType { public abstract object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null); public virtual JniValueMarshalerState CreateArgumentState (object? value, ParameterAttributes synchronize = 0) @@ -148,7 +148,7 @@ public virtual JniValueMarshalerState CreateArgumentState (object? value, internal object? CreateValue ( IntPtr handle, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType) { var r = new JniObjectReference (handle); @@ -236,7 +236,7 @@ protected static Expression DisposeObjectReference (Expression sourceValue) } public abstract class JniValueMarshaler< - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] T > : JniValueMarshaler @@ -246,7 +246,7 @@ public abstract class JniValueMarshaler< public abstract T CreateGenericValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null); public virtual JniValueMarshalerState CreateGenericArgumentState ([MaybeNull] T value, ParameterAttributes synchronize = 0) @@ -260,7 +260,7 @@ public virtual JniValueMarshalerState CreateGenericArgumentState ([MaybeNu public override object? CreateValue ( ref JniObjectReference reference, JniObjectReferenceOptions options, - [DynamicallyAccessedMembers (ConstructorsAndInterfaces)] + [DynamicallyAccessedMembers (Constructors)] Type? targetType = null) { return CreateGenericValue (ref reference, options, targetType ?? typeof (T)); From 113c855f94c1166f1eb9b1e9cd976900ff5539fa Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 18 Dec 2024 11:56:48 -0600 Subject: [PATCH 2/3] Remove more `DynamicallyAccessedMemberTypes.Interfaces` --- .../Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs | 8 +------- .../Java.Interop/JniValueMarshalerAttribute.cs | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs index b04bd1f34..b74d6ec87 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniMarshalMemberBuilder.cs @@ -142,12 +142,6 @@ string GetTypeSignature (ParameterInfo p) public JniValueMarshaler GetParameterMarshaler (ParameterInfo parameter) { - // Activator.CreateInstance requires DynamicallyAccessedMemberTypes.PublicParameterlessConstructor - // GetValueMarshaler requires DynamicallyAccessedMemberTypes.Interfaces - [UnconditionalSuppressMessage ("Trimming", "IL2072", Justification = "JniValueMarshalerAttribute is decorated with [DynamicallyAccessedMembers]")] - static JniValueMarshaler GetValueMarshaler (JniValueManager manager, ParameterInfo parameter) => - manager.GetValueMarshaler (parameter.ParameterType); - if (parameter.ParameterType == typeof (IntPtr)) return IntPtrValueMarshaler.Instance; @@ -160,7 +154,7 @@ static JniValueMarshaler GetValueMarshaler (JniValueManager manager, ParameterIn if (attr != null) { return (JniValueMarshaler) Activator.CreateInstance (attr.MarshalerType)!; } - return GetValueMarshaler (Runtime.ValueManager, parameter); + return Runtime.ValueManager.GetValueMarshaler (parameter.ParameterType); } // Heuristic: if first two parameters are IntPtr, this is a "direct" wrapper. diff --git a/src/Java.Interop/Java.Interop/JniValueMarshalerAttribute.cs b/src/Java.Interop/Java.Interop/JniValueMarshalerAttribute.cs index 03bb442b5..717fb30c6 100644 --- a/src/Java.Interop/Java.Interop/JniValueMarshalerAttribute.cs +++ b/src/Java.Interop/Java.Interop/JniValueMarshalerAttribute.cs @@ -8,7 +8,7 @@ namespace Java.Interop { [AttributeUsage (Targets, AllowMultiple=false)] public class JniValueMarshalerAttribute : Attribute { - const DynamicallyAccessedMemberTypes ParameterlessConstructorsInterfaces = DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.Interfaces; + const DynamicallyAccessedMemberTypes ParameterlessConstructors = DynamicallyAccessedMemberTypes.PublicParameterlessConstructor; const AttributeTargets Targets = AttributeTargets.Class | AttributeTargets.Enum | @@ -16,7 +16,7 @@ public class JniValueMarshalerAttribute : Attribute { AttributeTargets.Parameter | AttributeTargets.ReturnValue; public JniValueMarshalerAttribute ( - [DynamicallyAccessedMembers (ParameterlessConstructorsInterfaces)] + [DynamicallyAccessedMembers (ParameterlessConstructors)] Type marshalerType) { if (marshalerType == null) @@ -29,7 +29,7 @@ public JniValueMarshalerAttribute ( MarshalerType = marshalerType; } - [DynamicallyAccessedMembers (ParameterlessConstructorsInterfaces)] + [DynamicallyAccessedMembers (ParameterlessConstructors)] public Type MarshalerType { get; } From 4a67bf0816e5b9017b57d6940c6568d3487af990 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 18 Dec 2024 12:11:15 -0600 Subject: [PATCH 3/3] Remove more .Interfaces --- src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs | 4 ++-- src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs index cc778dba7..5f93dbe2b 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs @@ -83,7 +83,7 @@ public partial class JniTypeManager : IDisposable, ISetRuntime { internal const DynamicallyAccessedMemberTypes Methods = DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods; internal const DynamicallyAccessedMemberTypes MethodsAndPrivateNested = Methods | DynamicallyAccessedMemberTypes.NonPublicNestedTypes; - internal const DynamicallyAccessedMemberTypes MethodsConstructorsInterfaces = MethodsAndPrivateNested | DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces; + internal const DynamicallyAccessedMemberTypes MethodsConstructors = MethodsAndPrivateNested | DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; JniRuntime? runtime; bool disposed; @@ -285,7 +285,7 @@ static Type MakeGenericType (Type type, Type arrayType) => #pragma warning restore IL3050 [UnconditionalSuppressMessage ("Trimming", "IL2073", Justification = "Types returned here should be preserved via other means.")] - [return: DynamicallyAccessedMembers (MethodsConstructorsInterfaces)] + [return: DynamicallyAccessedMembers (MethodsConstructors)] public Type? GetType (JniTypeSignature typeSignature) { AssertValid (); diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs index 10c91f1e1..207359e61 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs @@ -898,16 +898,12 @@ sealed class ProxyValueMarshaler : JniValueMarshaler { public override JniValueMarshalerState CreateGenericObjectReferenceArgumentState ([MaybeNull]object? value, ParameterAttributes synchronize) { - [UnconditionalSuppressMessage ("Trimming", "IL2073", Justification = "This code path is not used in Android projects.")] - [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.Interfaces)] - static Type GetType (object value) => value.GetType (); - if (value == null) return new JniValueMarshalerState (); var jvm = JniEnvironment.Runtime; - var vm = jvm.ValueManager.GetValueMarshaler (GetType (value)); + var vm = jvm.ValueManager.GetValueMarshaler (value.GetType ()); if (vm != Instance) { var s = vm.CreateObjectReferenceArgumentState (value, synchronize); return new JniValueMarshalerState (s, vm);