Skip to content

Commit d58b191

Browse files
Address review findings and cleanup
- Replace try-finally cleanup with IDisposable temp directories - Add IGCUserPeer infrastructure methods (monodroidAddReference, monodroidClearReferences, refList) to JCW Java source generator - Port improved UCO attribute and NegativeEdgeCase tests from #10831 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 64d9be4 commit d58b191

File tree

4 files changed

+171
-152
lines changed

4 files changed

+171
-152
lines changed

src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/JcwJavaSourceGenerator.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ internal void Generate (JavaPeerInfo type, TextWriter writer)
8686
WriteStaticInitializer (type, writer);
8787
WriteConstructors (type, writer);
8888
WriteMethods (type, writer);
89+
WriteGCUserPeerMethods (writer);
8990
WriteClassClose (writer);
9091
}
9192

@@ -222,6 +223,27 @@ static void WriteMethods (JavaPeerInfo type, TextWriter writer)
222223
}
223224
}
224225

226+
static void WriteGCUserPeerMethods (TextWriter writer)
227+
{
228+
writer.Write ("""
229+
230+
private java.util.ArrayList refList;
231+
public void monodroidAddReference (java.lang.Object obj)
232+
{
233+
if (refList == null)
234+
refList = new java.util.ArrayList ();
235+
refList.add (obj);
236+
}
237+
238+
public void monodroidClearReferences ()
239+
{
240+
if (refList != null)
241+
refList.clear ();
242+
}
243+
244+
""");
245+
}
246+
225247
static void WriteClassClose (TextWriter writer)
226248
{
227249
writer.WriteLine ('}');

tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/FixtureTestBase.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,16 @@ protected static JavaPeerInfo FindFixtureByJavaName (string javaName)
3333
return peer;
3434
}
3535

36-
protected static void CleanUpDir (string path)
36+
protected static string CreateTempDir ()
3737
{
38-
var dir = Path.GetDirectoryName (path);
39-
if (dir != null && Directory.Exists (dir))
38+
var dir = Path.Combine (Path.GetTempPath (), $"typemap-test-{Guid.NewGuid ():N}");
39+
Directory.CreateDirectory (dir);
40+
return dir;
41+
}
42+
43+
protected static void DeleteTempDir (string dir)
44+
{
45+
if (Directory.Exists (dir))
4046
try { Directory.Delete (dir, true); } catch { }
4147
}
4248

tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/JcwJavaSourceGeneratorTests.cs

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,20 @@ public void JniTypeToJava_ConvertsCorrectly (string jniType, string expected)
6262

6363
}
6464

65-
public class Filtering
65+
public class Filtering : IDisposable
6666
{
67+
readonly string _outputDir = CreateTempDir ();
68+
public void Dispose () => DeleteTempDir (_outputDir);
6769

6870
[Fact]
6971
public void Generate_SkipsMcwTypes ()
7072
{
7173
var peers = ScanFixtures ();
7274
var generator = new JcwJavaSourceGenerator ();
73-
var outputDir = Path.Combine (Path.GetTempPath (), $"jcw-test-{Guid.NewGuid ():N}");
74-
try {
75-
var files = generator.Generate (peers, outputDir);
76-
Assert.DoesNotContain (files, f => f.EndsWith ("java/lang/Object.java"));
77-
Assert.DoesNotContain (files, f => f.EndsWith ("android/app/Activity.java"));
78-
Assert.Contains (files, f => f.Replace ('\\', '/').Contains ("my/app/MainActivity.java"));
79-
} finally {
80-
if (Directory.Exists (outputDir)) {
81-
Directory.Delete (outputDir, true);
82-
}
83-
}
75+
var files = generator.Generate (peers, _outputDir);
76+
Assert.DoesNotContain (files, f => f.EndsWith ("java/lang/Object.java"));
77+
Assert.DoesNotContain (files, f => f.EndsWith ("android/app/Activity.java"));
78+
Assert.Contains (files, f => f.Replace ('\\', '/').Contains ("my/app/MainActivity.java"));
8479
}
8580

8681
}
@@ -97,6 +92,15 @@ public void Generate_MainActivity_HasClassDeclaration ()
9792
Assert.Contains ("\t\tmono.android.IGCUserPeer\n", java);
9893
}
9994

95+
[Fact]
96+
public void Generate_MainActivity_HasIGCUserPeerMethods ()
97+
{
98+
var java = GenerateFixture ("my/app/MainActivity");
99+
Assert.Contains ("private java.util.ArrayList refList;", java);
100+
Assert.Contains ("public void monodroidAddReference (java.lang.Object obj)", java);
101+
Assert.Contains ("public void monodroidClearReferences ()", java);
102+
}
103+
100104
[Fact]
101105
public void Generate_AbstractType_HasAbstractModifier ()
102106
{
@@ -247,28 +251,23 @@ public void Generate_NestedType_HasCorrectPackageAndClassName ()
247251

248252
}
249253

250-
public class OutputFilePath
254+
public class OutputFilePath : IDisposable
251255
{
256+
readonly string _outputDir = CreateTempDir ();
257+
public void Dispose () => DeleteTempDir (_outputDir);
252258

253259
[Fact]
254260
public void Generate_CreatesCorrectFileStructure ()
255261
{
256262
var peers = ScanFixtures ();
257263
var generator = new JcwJavaSourceGenerator ();
258-
var outputDir = Path.Combine (Path.GetTempPath (), $"jcw-test-{Guid.NewGuid ():N}");
259-
try {
260-
var files = generator.Generate (peers, outputDir);
261-
Assert.NotEmpty (files);
262-
263-
foreach (var file in files) {
264-
Assert.StartsWith (outputDir, file);
265-
Assert.True (File.Exists (file), $"Generated file should exist: {file}");
266-
Assert.EndsWith (".java", file);
267-
}
268-
} finally {
269-
if (Directory.Exists (outputDir)) {
270-
Directory.Delete (outputDir, true);
271-
}
264+
var files = generator.Generate (peers, _outputDir);
265+
Assert.NotEmpty (files);
266+
267+
foreach (var file in files) {
268+
Assert.StartsWith (_outputDir, file);
269+
Assert.True (File.Exists (file), $"Generated file should exist: {file}");
270+
Assert.EndsWith (".java", file);
272271
}
273272
}
274273

@@ -287,8 +286,7 @@ public void Generate_InvalidJniName_Throws (string badJniName)
287286
{
288287
var peer = MakeAcwPeer (badJniName, "Test.Bad", "TestApp");
289288
var generator = new JcwJavaSourceGenerator ();
290-
var outputDir = Path.Combine (Path.GetTempPath (), $"jcw-test-{Guid.NewGuid ():N}");
291-
Assert.Throws<ArgumentException> (() => generator.Generate (new [] { peer }, outputDir));
289+
Assert.Throws<ArgumentException> (() => generator.Generate (new [] { peer }, _outputDir));
292290
}
293291

294292
[Theory]
@@ -301,14 +299,7 @@ public void Generate_ValidJniName_DoesNotThrow (string validJniName)
301299
{
302300
var peer = MakeAcwPeer (validJniName, "Test.Valid", "TestApp");
303301
var generator = new JcwJavaSourceGenerator ();
304-
var outputDir = Path.Combine (Path.GetTempPath (), $"jcw-test-{Guid.NewGuid ():N}");
305-
try {
306-
generator.Generate (new [] { peer }, outputDir);
307-
} finally {
308-
if (Directory.Exists (outputDir)) {
309-
Directory.Delete (outputDir, true);
310-
}
311-
}
302+
generator.Generate (new [] { peer }, _outputDir);
312303
}
313304

314305
}

0 commit comments

Comments
 (0)