From 830af191dd61c53561581c6b2a02ab80b3f7c330 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 30 Mar 2026 12:51:12 +0000 Subject: [PATCH 1/3] Initial plan From c0a25a093e382f674c4fd8ceec5aafb31b78787c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 07:37:41 +0000 Subject: [PATCH 2/3] Add GetStaticMethodFallbackTypesCore override to TrimmableTypeMapTypeManager Agent-Logs-Url: https://github.com/dotnet/android/sessions/1eb1fc88-df89-4cb7-bd45-15187eea3776 Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com> --- .../TrimmableTypeMapTypeManager.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Mono.Android/Microsoft.Android.Runtime/TrimmableTypeMapTypeManager.cs b/src/Mono.Android/Microsoft.Android.Runtime/TrimmableTypeMapTypeManager.cs index 220be6aae78..ad6c1d116d7 100644 --- a/src/Mono.Android/Microsoft.Android.Runtime/TrimmableTypeMapTypeManager.cs +++ b/src/Mono.Android/Microsoft.Android.Runtime/TrimmableTypeMapTypeManager.cs @@ -60,6 +60,18 @@ protected override IEnumerable GetSimpleReferences (Type type) return base.GetInvokerTypeCore (type); } + protected override IReadOnlyList? GetStaticMethodFallbackTypesCore (string jniSimpleReference) + { + int slash = jniSimpleReference.LastIndexOf ('/'); + var desugarType = slash > 0 + ? $"{jniSimpleReference.Substring (0, slash + 1)}Desugar{jniSimpleReference.Substring (slash + 1)}" + : $"Desugar{jniSimpleReference}"; + return new[] { + $"{desugarType}$_CC", + $"{jniSimpleReference}$-CC", + }; + } + public override void RegisterNativeMembers ( JniType nativeClass, [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] From b8d9ccac67a3009d4d2961efe1285aee07394497 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:06:21 +0000 Subject: [PATCH 3/3] Add test for TrimmableTypeMapTypeManager.GetStaticMethodFallbackTypesCore Agent-Logs-Url: https://github.com/dotnet/android/sessions/66cf81ea-433f-43ac-8c85-45bb0483a230 Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- .../TrimmableTypeMapTypeManagerTests.cs | 50 +++++++++++++++++++ .../Mono.Android.NET-Tests.csproj | 1 + 2 files changed, 51 insertions(+) create mode 100644 tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/TrimmableTypeMapTypeManagerTests.cs diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/TrimmableTypeMapTypeManagerTests.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/TrimmableTypeMapTypeManagerTests.cs new file mode 100644 index 00000000000..e5e7f9e134c --- /dev/null +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/TrimmableTypeMapTypeManagerTests.cs @@ -0,0 +1,50 @@ +using Java.Interop; +using Microsoft.Android.Runtime; +using NUnit.Framework; + +namespace Java.InteropTests +{ + [TestFixture] + public class TrimmableTypeMapTypeManagerTests + { + // Test subclass that allows instantiation without full TrimmableTypeMap initialization. + // GetStaticMethodFallbackTypesCore does not use TrimmableTypeMap.Instance, so the test + // can run without an initialized TrimmableTypeMap singleton. + sealed class TestableTrimmableTypeMapTypeManager : TrimmableTypeMapTypeManager + { + } + + [Test] + public void GetStaticMethodFallbackTypes_WithPackageName_ReturnsDesugarFallbacks () + { + using var manager = new TestableTrimmableTypeMapTypeManager (); + var fallbacks = manager.GetStaticMethodFallbackTypes ("android/app/Activity"); + Assert.IsNotNull (fallbacks); + Assert.AreEqual (2, fallbacks!.Count); + Assert.AreEqual ("android/app/DesugarActivity$_CC", fallbacks [0]); + Assert.AreEqual ("android/app/Activity$-CC", fallbacks [1]); + } + + [Test] + public void GetStaticMethodFallbackTypes_WithoutPackageName_ReturnsDesugarFallbacks () + { + using var manager = new TestableTrimmableTypeMapTypeManager (); + var fallbacks = manager.GetStaticMethodFallbackTypes ("Activity"); + Assert.IsNotNull (fallbacks); + Assert.AreEqual (2, fallbacks!.Count); + Assert.AreEqual ("DesugarActivity$_CC", fallbacks [0]); + Assert.AreEqual ("Activity$-CC", fallbacks [1]); + } + + [Test] + public void GetStaticMethodFallbackTypes_WithDeepPackageName_ReturnsDesugarFallbacks () + { + using var manager = new TestableTrimmableTypeMapTypeManager (); + var fallbacks = manager.GetStaticMethodFallbackTypes ("com/example/package/MyInterface"); + Assert.IsNotNull (fallbacks); + Assert.AreEqual (2, fallbacks!.Count); + Assert.AreEqual ("com/example/package/DesugarMyInterface$_CC", fallbacks [0]); + Assert.AreEqual ("com/example/package/MyInterface$-CC", fallbacks [1]); + } + } +} diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj index ae33bef1571..33bb45ed65c 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj @@ -98,6 +98,7 @@ +