From fb2af186fe911897c6f83642f5c61ddf94368b9d Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Mon, 16 Oct 2023 08:21:14 -1000 Subject: [PATCH 1/2] [class-parse] Add Kotlin metadata to `-dump`. --- tools/class-parse/Program.cs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/class-parse/Program.cs b/tools/class-parse/Program.cs index 5c21d5588..e0f453f11 100644 --- a/tools/class-parse/Program.cs +++ b/tools/class-parse/Program.cs @@ -8,6 +8,8 @@ using Mono.Options; using Xamarin.Android.Tools.Bytecode; +using System.Text.Json; +using System.Text.Json.Serialization; namespace Xamarin.Android.Tools { @@ -159,6 +161,29 @@ static void DumpClassFile (ClassFile c, TextWriter output) output.WriteLine ("\t\t{0}", attr); } } + + // Output Kotlin metadata if it exists + var kotlin_metadata = c.Attributes.OfType ().FirstOrDefault ()?.Annotations.FirstOrDefault (a => a.Type == "Lkotlin/Metadata;"); + + if (kotlin_metadata is not null) { + var meta = KotlinMetadata.FromAnnotation (kotlin_metadata); + + if (meta.AsClassMetadata () is KotlinClass kc) { + Console.WriteLine (); + Console.WriteLine ($"Kotlin Class Metadata [{meta.MetadataVersion}]:"); + var json = JsonSerializer.Serialize (kc, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }); + output.WriteLine (json); + } else if (meta.AsFileMetadata () is KotlinFile kf) { + Console.WriteLine (); + Console.WriteLine ($"Kotlin File Metadata [{meta.MetadataVersion}]:"); + var json = JsonSerializer.Serialize (kf, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }); + output.WriteLine (json); + } + + Console.WriteLine (); + Console.WriteLine ("Kotlin Metadata String Table:"); + output.WriteLine (JsonSerializer.Serialize (meta.Data2, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true })); + } } } } From 0f519cf9801a2db8488ed653ee414639e3ceee6d Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Mon, 16 Oct 2023 15:25:17 -0400 Subject: [PATCH 2/2] Update Program.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All writes should go through `output.`, not `Console`, so that `class-parse -o FILE` works properly. Re-indent various pieces of code. Update JSON printing so that it starts on the same line as the "header", a'la ``` Kotlin Class Metadata [1.8.0]: { "$id": "1", … } ``` --- tools/class-parse/Program.cs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/class-parse/Program.cs b/tools/class-parse/Program.cs index e0f453f11..bf3b2f178 100644 --- a/tools/class-parse/Program.cs +++ b/tools/class-parse/Program.cs @@ -163,26 +163,29 @@ static void DumpClassFile (ClassFile c, TextWriter output) } // Output Kotlin metadata if it exists - var kotlin_metadata = c.Attributes.OfType ().FirstOrDefault ()?.Annotations.FirstOrDefault (a => a.Type == "Lkotlin/Metadata;"); + var kotlin_metadata = c.Attributes.OfType () + .FirstOrDefault ()?.Annotations + .FirstOrDefault (a => a.Type == "Lkotlin/Metadata;"); if (kotlin_metadata is not null) { var meta = KotlinMetadata.FromAnnotation (kotlin_metadata); + var jopt = new JsonSerializerOptions { + ReferenceHandler = ReferenceHandler.Preserve, + WriteIndented = true, + }; if (meta.AsClassMetadata () is KotlinClass kc) { - Console.WriteLine (); - Console.WriteLine ($"Kotlin Class Metadata [{meta.MetadataVersion}]:"); - var json = JsonSerializer.Serialize (kc, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }); - output.WriteLine (json); + output.WriteLine (); + var json = JsonSerializer.Serialize (kc, jopt); + output.WriteLine ($"Kotlin Class Metadata [{meta.MetadataVersion}]: {json}"); } else if (meta.AsFileMetadata () is KotlinFile kf) { - Console.WriteLine (); - Console.WriteLine ($"Kotlin File Metadata [{meta.MetadataVersion}]:"); - var json = JsonSerializer.Serialize (kf, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }); - output.WriteLine (json); + output.WriteLine (); + var json = JsonSerializer.Serialize (kf, jopt); + output.WriteLine ($"Kotlin File Metadata [{meta.MetadataVersion}]: {json}"); } - Console.WriteLine (); - Console.WriteLine ("Kotlin Metadata String Table:"); - output.WriteLine (JsonSerializer.Serialize (meta.Data2, new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true })); + output.WriteLine (); + output.WriteLine ($"Kotlin Metadata String Table: {JsonSerializer.Serialize (meta.Data2, jopt)}"); } } }