From e8922dd54f0127906d221ab579837981ccd43627 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 17 May 2022 15:53:31 +0200 Subject: [PATCH 1/4] Fix marshal method descriptors Context: fb94d598bddf7818d841914dd4f565cf5cd0bbac fb94d598 added code to collect all overriden method descriptors in a list, so that the future marshal methods code generator can generate correct code for them. However, not all gathered descriptors contained name of the managed type which declares the overridden methods. This commit fixes the problem. --- .../JavaCallableWrapperGenerator.cs | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs index 9bbc997ef..853790bb4 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs @@ -34,9 +34,11 @@ public class OverriddenMethodDescriptor public string JniSignature { get; } public string Connector { get; } public string ManagedTypeName { get; } + public string OriginalDescString { get; } - public OverriddenMethodDescriptor (string javaPackageName, string methodDescription) + public OverriddenMethodDescriptor (string javaPackageName, string methodDescription, string fallbackManagedTypeName) { + OriginalDescString = methodDescription; JavaPackageName = javaPackageName; string[] parts = methodDescription.Split (methodDescSplitChars, 4); @@ -49,9 +51,13 @@ public OverriddenMethodDescriptor (string javaPackageName, string methodDescript if (parts.Length > 2) { Connector = parts[2]; if (parts.Length > 3) { - ManagedTypeName = parts[3]; + ManagedTypeName = parts[3].Replace ('/', '+'); } } + + if (String.IsNullOrEmpty (ManagedTypeName)) { + ManagedTypeName = fallbackManagedTypeName; + } } } @@ -529,7 +535,6 @@ string GetManagedParameters (MethodDefinition ctor, string outerType) public void Generate (TextWriter writer) { - overriddenMethodDescriptors = new List (); if (!string.IsNullOrEmpty (package)) { writer.WriteLine ("package " + package + ";"); writer.WriteLine (); @@ -563,17 +568,6 @@ public void Generate (TextWriter writer) } GenerateFooter (writer); - - string javaTypeName = $"{package}.{name}"; - AddOverridenMethods (methods); - AddOverridenMethods (ctors); - - void AddOverridenMethods (List list) - { - foreach (Signature sig in list) { - overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, sig.Method)); - } - } } public void Generate (string outputPath) @@ -716,9 +710,17 @@ void GenerateBody (TextWriter sw) void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, string field) { + if (overriddenMethodDescriptors == null) { + overriddenMethodDescriptors = new List (); + } + sw.WriteLine ("\t\t{0} = ", field); - foreach (Signature method in self.methods) + string managedTypeName = self.type.GetPartialAssemblyQualifiedName (cache); + string javaTypeName = $"{package}.{name}"; + foreach (Signature method in self.methods) { sw.WriteLine ("\t\t\t\"{0}\\n\" +", method.Method); + overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, method.Method, managedTypeName)); + } sw.WriteLine ("\t\t\t\"\";"); if (CannotRegisterInStaticConstructor (self.type)) return; @@ -732,7 +734,7 @@ void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, str break; } sw.Write ("\t\t"); - sw.WriteLine (format, self.type.GetPartialAssemblyQualifiedName (cache), self.name, field); + sw.WriteLine (format, managedTypeName, self.name, field); } void GenerateFooter (TextWriter sw) From 0f9274eee27a510df905bb662ac359a5a477f560 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 19 May 2022 16:21:33 +0200 Subject: [PATCH 2/4] Apply requested changes --- .../Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs | 6 ++++-- .../JavaCallableWrapperGenerator.cs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs index 681d4efbb..de9433855 100644 --- a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs +++ b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs @@ -143,7 +143,7 @@ public static string GetPartialAssemblyQualifiedName (this TypeReference type, I return string.Format ("{0}, {1}", // Cecil likes to use '/' as the nested type separator, while // Reflection uses '+' as the nested type separator. Use Reflection. - type.FullName.Replace ('/', '+'), + CecilTypeNameToReflectionTypeName (type.FullName), type.GetPartialAssemblyName (resolver)); } @@ -160,7 +160,7 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat return string.Format ("{0}, {1}", // Cecil likes to use '/' as the nested type separator, while // Reflection uses '+' as the nested type separator. Use Reflection. - type.FullName.Replace ('/', '+'), + CecilTypeNameToReflectionTypeName (type.FullName), (def ?? type).Module.Assembly.Name.FullName); } @@ -188,5 +188,7 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat return null; } + + public static string CecilTypeNameToReflectionTypeName (string typeName) => typeName.Replace ('/', '+'); } } diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs index 853790bb4..d30bce4aa 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs @@ -51,7 +51,7 @@ public OverriddenMethodDescriptor (string javaPackageName, string methodDescript if (parts.Length > 2) { Connector = parts[2]; if (parts.Length > 3) { - ManagedTypeName = parts[3].Replace ('/', '+'); + ManagedTypeName = TypeDefinitionRocks.CecilTypeNameToReflectionTypeName (parts[3]); } } From aa578fe705900ab2d453e3d19bca50eab900b9c6 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 19 May 2022 16:49:11 +0200 Subject: [PATCH 3/4] Behave --- .../Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs index de9433855..d6af1ba64 100644 --- a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs +++ b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs @@ -189,6 +189,6 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat return null; } - public static string CecilTypeNameToReflectionTypeName (string typeName) => typeName.Replace ('/', '+'); + public static string? CecilTypeNameToReflectionTypeName (string typeName) => typeName?.Replace ('/', '+'); } } From 75d9efe45ada7d110ac04fb875d15cc5275bacde Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 19 May 2022 11:17:12 -0400 Subject: [PATCH 4/4] Allow null values --- .../Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs index d6af1ba64..1bb282d19 100644 --- a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs +++ b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs @@ -189,6 +189,6 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat return null; } - public static string? CecilTypeNameToReflectionTypeName (string typeName) => typeName?.Replace ('/', '+'); + public static string? CecilTypeNameToReflectionTypeName (string? typeName) => typeName?.Replace ('/', '+'); } }