Skip to content

Commit

Permalink
[Java.Interop] supress one instance of IL2072 (#1205)
Browse files Browse the repository at this point in the history
Context: dotnet/android#8805

When testing new defaults for `$(TrimMode)=full` in
dotnet/android#8805:

	% dotnet new android
	% dotnet build -c Release -r android-arm64

Results in a single warning:

	external\Java.Interop\src\Java.Interop\Java.Interop\JniRuntime.JniValueManager.cs(890,4):
	  Trim analysis warning IL2072: Java.Interop.ProxyValueMarshaler.CreateGenericObjectReferenceArgumentState(Object, ParameterAttributes):
	  'type' argument does not satisfy 'DynamicallyAccessedMemberTypes.Interfaces' in call to 'Java.Interop.JniRuntime.JniValueManager.GetValueMarshaler(Type)'.
	  The return value of method 'System.Object.GetType()' does not have matching annotations.
	  The source value must declare at least the same requirements as those declared on the target location it is assigned to.

This appears to be a case where the trimmer (ILLink's analyzers) can
detect a problem where the Roslyn analyzer could not.  It is generally
possible for the trimmer to discover some new warning, as it has a
complete view of the final code.

This appears to be similar to some other places we used the justification:

	[UnconditionalSuppressMessage ("Trimming", "IL2073", Justification = "This code path is not used in Android projects.")]
  • Loading branch information
jonathanpeppers authored Mar 13, 2024
1 parent 5bca8ad commit 651de42
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/Java.Interop/Java.Interop/JniRuntime.JniValueManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -884,12 +884,16 @@ sealed class ProxyValueMarshaler : JniValueMarshaler<object?> {

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 (value.GetType ());
var vm = jvm.ValueManager.GetValueMarshaler (GetType (value));
if (vm != Instance) {
var s = vm.CreateObjectReferenceArgumentState (value, synchronize);
return new JniValueMarshalerState (s, vm);
Expand Down

0 comments on commit 651de42

Please sign in to comment.