From a063cc12a44bd2a033fd981d0f7704b169b04e6c Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 15:53:06 +0200 Subject: [PATCH 01/11] [marshal-methods] Add marshal methods classification code Add code which classifies methods selected by `JavaCallableWrapperGenerator` and decides whether they are to be registered dynamically or using the future native code marshal methods. If a type `JavaCallableWrapperGenerator` is processing is found to not have any dynamically registered methods, then the code to register them is no longer generated. --- .../Android.Runtime/RegisterAttribute.cs | 11 +- .../JavaCallableWrapperGenerator.cs | 123 +++++++++--------- 2 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index ec1ea955e..dba53d7b7 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -1,5 +1,7 @@ using System; +using Mono.Cecil; + namespace Android.Runtime { [AttributeUsage (AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Method | AttributeTargets.Property)] @@ -12,18 +14,21 @@ sealed class RegisterAttribute : Attribute, Java.Interop.IJniNameProviderAttribu string name; string signature; - public RegisterAttribute (string name) + public RegisterAttribute (string name, CustomAttribute originAttribute) { this.name = name; + OriginAttribute = originAttribute; } - public RegisterAttribute (string name, string signature, string connector) - : this (name) + public RegisterAttribute (string name, string signature, string connector, CustomAttribute originAttribute) + : this (name, originAttribute) { this.connector = connector; this.signature = signature; } + public CustomAttribute OriginAttribute { get; } + public string Connector { get { return connector; } set { connector = value; } 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 d30bce4aa..b37a2bf57 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 @@ -25,40 +25,9 @@ public enum JavaPeerStyle { JavaInterop1, } - public class OverriddenMethodDescriptor + public interface IJCWMethodClassifier { - static readonly char[] methodDescSplitChars = new char[] { ':' }; - - public string JavaPackageName { get; } - public string NativeName { get; } - public string JniSignature { get; } - public string Connector { get; } - public string ManagedTypeName { get; } - public string OriginalDescString { get; } - - public OverriddenMethodDescriptor (string javaPackageName, string methodDescription, string fallbackManagedTypeName) - { - OriginalDescString = methodDescription; - JavaPackageName = javaPackageName; - string[] parts = methodDescription.Split (methodDescSplitChars, 4); - - if (parts.Length < 2) { - throw new InvalidOperationException ($"Unexpected format for method description. Expected at least 2 parts, got {parts.Length} from: '{methodDescription}'"); - } - - NativeName = parts[0]; - JniSignature = parts[1]; - if (parts.Length > 2) { - Connector = parts[2]; - if (parts.Length > 3) { - ManagedTypeName = TypeDefinitionRocks.CecilTypeNameToReflectionTypeName (parts[3]); - } - } - - if (String.IsNullOrEmpty (ManagedTypeName)) { - ManagedTypeName = fallbackManagedTypeName; - } - } + bool ShouldBeDynamicallyRegistered (MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); } public class JavaCallableWrapperGenerator { @@ -95,21 +64,22 @@ public string GetJavaAccess () List methods = new List (); List ctors = new List (); List children; - List overriddenMethodDescriptors; + readonly IMetadataResolver cache; + readonly IJCWMethodClassifier methodClassifier; [Obsolete ("Use the TypeDefinitionCache overload for better performance.")] public JavaCallableWrapperGenerator (TypeDefinition type, Action log) : this (type, null, log, resolver: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache) - : this (type, log, (IMetadataResolver) cache) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, IJCWMethodClassifier methodClassifier = null) + : this (type, log, (IMetadataResolver) cache, methodClassifier) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver) - : this (type, null, log, resolver) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, IJCWMethodClassifier methodClassifier = null) + : this (type, null, log, resolver, methodClassifier) { if (type.HasNestedTypes) { children = new List (); @@ -117,7 +87,6 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action OverriddenMethodDescriptors => overriddenMethodDescriptors; public string ApplicationJavaClass { get; set; } public JavaPeerStyle CodeGenerationTarget { get; set; } @@ -125,6 +94,8 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action methods.Any ((Signature sig) => sig.IsDynamicallyRegistered); + /// /// The Java source code to be included in Instrumentation.onCreate /// @@ -152,8 +123,9 @@ void AddNestedTypes (TypeDefinition type) HasExport |= children.Any (t => t.HasExport); } - JavaCallableWrapperGenerator (TypeDefinition type, string outerType, Action log, IMetadataResolver resolver) + JavaCallableWrapperGenerator (TypeDefinition type, string outerType, Action log, IMetadataResolver resolver, IJCWMethodClassifier methodClassifier = null) { + this.methodClassifier = methodClassifier; this.type = type; this.log = log; this.cache = resolver ?? new TypeDefinitionCache (); @@ -366,12 +338,13 @@ internal static RegisterAttribute ToRegisterAttribute (CustomAttribute attr) // attr.Resolve (); RegisterAttribute r = null; if (attr.ConstructorArguments.Count == 1) - r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value); + r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, attr); else if (attr.ConstructorArguments.Count == 3) r = new RegisterAttribute ( (string) attr.ConstructorArguments [0].Value, (string) attr.ConstructorArguments [1].Value, - (string) attr.ConstructorArguments [2].Value); + (string) attr.ConstructorArguments [2].Value, + attr); if (r != null) { var v = attr.Properties.FirstOrDefault (p => p.Name == "DoNotGenerateAcw"); r.DoNotGenerateAcw = v.Name == null ? false : (bool) v.Argument.Value; @@ -384,7 +357,7 @@ internal static RegisterAttribute RegisterFromJniTypeSignatureAttribute (CustomA // attr.Resolve (); RegisterAttribute r = null; if (attr.ConstructorArguments.Count == 1) - r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value); + r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, attr); if (r != null) { var v = attr.Properties.FirstOrDefault (p => p.Name == "GenerateJavaPeer"); if (v.Name == null) { @@ -403,7 +376,8 @@ internal static RegisterAttribute RegisterFromJniMethodSignatureAttribute (Custo if (attr.ConstructorArguments.Count == 2) r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, (string) attr.ConstructorArguments [1].Value, - ""); + "", + attr); return r; } @@ -467,7 +441,8 @@ void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedM if (attr.Name.Contains ("-impl") || (attr.Name.Length > 7 && attr.Name[attr.Name.Length - 8] == '-')) Diagnostic.Error (4217, LookupSource (implementedMethod), Localization.Resources.JavaCallableWrappers_XA4217, attr.Name); - var msig = new Signature (implementedMethod, attr); + bool shouldBeDynamicallyRegistered = methodClassifier?.ShouldBeDynamicallyRegistered (registeredMethod, implementedMethod, attr.OriginAttribute) ?? false; + var msig = new Signature (implementedMethod, attr, shouldBeDynamicallyRegistered); if (!registeredMethod.IsConstructor && !methods.Any (m => m.Name == msig.Name && m.Params == msig.Params)) methods.Add (msig); } @@ -542,21 +517,38 @@ public void Generate (TextWriter writer) GenerateHeader (writer); - writer.WriteLine ("/** @hide */"); - writer.WriteLine ("\tpublic static final String __md_methods;"); + bool needCtor = false; + if (HasDynamicallyRegisteredMethods) { + needCtor = true; + writer.WriteLine ("/** @hide */"); + writer.WriteLine ("\tpublic static final String __md_methods;"); + } + if (children != null) { - foreach (var i in Enumerable.Range (1, children.Count)) + for (int i = 0; i < children.Count; i++) { + if (!children[i].HasDynamicallyRegisteredMethods) { + continue; + } + needCtor = true; writer.WriteLine ("\tstatic final String __md_{0}_methods;", i); + } } - writer.WriteLine ("\tstatic {"); - GenerateRegisterType (writer, this, "__md_methods"); - if (children != null) { - for (int i = 0; i < children.Count; ++i) { - string methods = string.Format ("__md_{0}_methods", i + 1); - GenerateRegisterType (writer, children [i], methods); + + if (needCtor) { + writer.WriteLine ("\tstatic {"); + + if (HasDynamicallyRegisteredMethods) { + GenerateRegisterType (writer, this, "__md_methods"); + } + + if (children != null) { + for (int i = 0; i < children.Count; ++i) { + string methods = string.Format ("__md_{0}_methods", i + 1); + GenerateRegisterType (writer, children [i], methods); + } } + writer.WriteLine ("\t}"); } - writer.WriteLine ("\t}"); GenerateBody (writer); @@ -710,16 +702,19 @@ void GenerateBody (TextWriter sw) void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, string field) { - if (overriddenMethodDescriptors == null) { - overriddenMethodDescriptors = new List (); + string managedTypeName = self.type.GetPartialAssemblyQualifiedName (cache); + string javaTypeName = $"{package}.{name}"; + + if (!self.HasDynamicallyRegisteredMethods) { + return; } sw.WriteLine ("\t\t{0} = ", field); - 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)); + if (method.IsDynamicallyRegistered) { + sw.WriteLine ("\t\t\t\"{0}\\n\" +", method.Method); + } } sw.WriteLine ("\t\t\t\"\";"); if (CannotRegisterInStaticConstructor (self.type)) @@ -772,12 +767,13 @@ bool CannotRegisterInStaticConstructor (TypeDefinition type) class Signature { - public Signature (MethodDefinition method, RegisterAttribute register) : this (method, register, null, null) {} + public Signature (MethodDefinition method, RegisterAttribute register, bool shouldBeDynamicallyRegistered = true) : this (method, register, null, null, shouldBeDynamicallyRegistered) {} - public Signature (MethodDefinition method, RegisterAttribute register, string managedParameters, string outerType) + public Signature (MethodDefinition method, RegisterAttribute register, string managedParameters, string outerType, bool shouldBeDynamicallyRegistered = true) : this (register.Name, register.Signature, register.Connector, managedParameters, outerType, null) { Annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", method.CustomAttributes); + IsDynamicallyRegistered = shouldBeDynamicallyRegistered; } public Signature (MethodDefinition method, ExportAttribute export, IMetadataResolver cache) @@ -880,6 +876,7 @@ public string ThrowsDeclaration { public readonly string Method; public readonly bool IsExport; public readonly bool IsStatic; + public readonly bool IsDynamicallyRegistered = true; public readonly string [] ThrownTypeNames; public readonly string Annotations; } From 5e07701abf7d77336aa7b54ca5851754aec4ddba Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 16:04:56 +0200 Subject: [PATCH 02/11] Restore compatibility --- .../Android.Runtime/RegisterAttribute.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index dba53d7b7..819aa0421 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -14,19 +14,30 @@ sealed class RegisterAttribute : Attribute, Java.Interop.IJniNameProviderAttribu string name; string signature; - public RegisterAttribute (string name, CustomAttribute originAttribute) + public RegisterAttribute (string name) { this.name = name; + } + + public RegisterAttribute (string name, CustomAttribute originAttribute) + : this (name) + { OriginAttribute = originAttribute; } - public RegisterAttribute (string name, string signature, string connector, CustomAttribute originAttribute) + public RegisterAttribute (string name, string signature, string connector) : this (name, originAttribute) { this.connector = connector; this.signature = signature; } + public RegisterAttribute (string name, string signature, string connector, CustomAttribute originAttribute) + : this (name, signature, connector) + { + OriginAttribute = originAttribute; + } + public CustomAttribute OriginAttribute { get; } public string Connector { From 6723dae80561845cf3b4704476841d43c5b06538 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 16:12:04 +0200 Subject: [PATCH 03/11] Fix --- .../Android.Runtime/RegisterAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index 819aa0421..65c4547a7 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -26,7 +26,7 @@ public RegisterAttribute (string name, CustomAttribute originAttribute) } public RegisterAttribute (string name, string signature, string connector) - : this (name, originAttribute) + : this (name) { this.connector = connector; this.signature = signature; From 218ce9ffb2a184fb1f52c7c29e6be02bfb1e72e3 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 16:29:33 +0200 Subject: [PATCH 04/11] Defaults, fool --- .../JavaCallableWrapperGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b37a2bf57..cfc60dde1 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 @@ -441,7 +441,7 @@ void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedM if (attr.Name.Contains ("-impl") || (attr.Name.Length > 7 && attr.Name[attr.Name.Length - 8] == '-')) Diagnostic.Error (4217, LookupSource (implementedMethod), Localization.Resources.JavaCallableWrappers_XA4217, attr.Name); - bool shouldBeDynamicallyRegistered = methodClassifier?.ShouldBeDynamicallyRegistered (registeredMethod, implementedMethod, attr.OriginAttribute) ?? false; + bool shouldBeDynamicallyRegistered = methodClassifier?.ShouldBeDynamicallyRegistered (registeredMethod, implementedMethod, attr.OriginAttribute) ?? true; var msig = new Signature (implementedMethod, attr, shouldBeDynamicallyRegistered); if (!registeredMethod.IsConstructor && !methods.Any (m => m.Name == msig.Name && m.Params == msig.Params)) methods.Add (msig); From 66cc1aedcb1a20ad5f7d9a8b5edc21ecbd4d2c03 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 16:49:44 +0200 Subject: [PATCH 05/11] More compatibility --- .../JavaCallableWrapperGenerator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 cfc60dde1..0688a13d0 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 @@ -94,7 +94,8 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action methods.Any ((Signature sig) => sig.IsDynamicallyRegistered); + // If there are no methods, we need to generate "empty" registration because of backward compatibility + public bool HasDynamicallyRegisteredMethods => methods.Count == 0 || methods.Any ((Signature sig) => sig.IsDynamicallyRegistered); /// /// The Java source code to be included in Instrumentation.onCreate From cc44e97a4b619759765cda9fc59f3ded5318b405 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 23 Jun 2022 17:18:15 +0200 Subject: [PATCH 06/11] More backward compat --- .../JavaCallableWrapperGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0688a13d0..770ef9f36 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 @@ -531,7 +531,7 @@ public void Generate (TextWriter writer) continue; } needCtor = true; - writer.WriteLine ("\tstatic final String __md_{0}_methods;", i); + writer.WriteLine ("\tstatic final String __md_{0}_methods;", i + 1); } } From 45ddb323f2b9b0103002fb7c1b22df4c1fb061f9 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Mon, 27 Jun 2022 20:03:37 +0200 Subject: [PATCH 07/11] Update --- .../Android.Runtime/RegisterAttribute.cs | 14 +++++++------- .../JavaCallableWrapperGenerator.cs | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index 65c4547a7..7f8e1a1b7 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -19,18 +19,18 @@ public RegisterAttribute (string name) this.name = name; } - public RegisterAttribute (string name, CustomAttribute originAttribute) - : this (name) - { - OriginAttribute = originAttribute; - } - public RegisterAttribute (string name, string signature, string connector) : this (name) { this.connector = connector; this.signature = signature; } +#if HAVE_CECIL + public RegisterAttribute (string name, CustomAttribute originAttribute) + : this (name) + { + OriginAttribute = originAttribute; + } public RegisterAttribute (string name, string signature, string connector, CustomAttribute originAttribute) : this (name, signature, connector) @@ -39,7 +39,7 @@ public RegisterAttribute (string name, string signature, string connector, Custo } public CustomAttribute OriginAttribute { get; } - +#endif public string Connector { get { return connector; } set { connector = value; } 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 770ef9f36..afde1e484 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 @@ -25,9 +25,9 @@ public enum JavaPeerStyle { JavaInterop1, } - public interface IJCWMethodClassifier + public abstract class JavaCallableMethodClassifier { - bool ShouldBeDynamicallyRegistered (MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); + public abstract bool ShouldBeDynamicallyRegistered (MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); } public class JavaCallableWrapperGenerator { @@ -66,19 +66,19 @@ public string GetJavaAccess () List children; readonly IMetadataResolver cache; - readonly IJCWMethodClassifier methodClassifier; + readonly JavaCallableMethodClassifier methodClassifier; [Obsolete ("Use the TypeDefinitionCache overload for better performance.")] public JavaCallableWrapperGenerator (TypeDefinition type, Action log) : this (type, null, log, resolver: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, IJCWMethodClassifier methodClassifier = null) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, JavaCallableMethodClassifier methodClassifier = null) : this (type, log, (IMetadataResolver) cache, methodClassifier) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, IJCWMethodClassifier methodClassifier = null) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier = null) : this (type, null, log, resolver, methodClassifier) { if (type.HasNestedTypes) { @@ -124,7 +124,7 @@ void AddNestedTypes (TypeDefinition type) HasExport |= children.Any (t => t.HasExport); } - JavaCallableWrapperGenerator (TypeDefinition type, string outerType, Action log, IMetadataResolver resolver, IJCWMethodClassifier methodClassifier = null) + JavaCallableWrapperGenerator (TypeDefinition type, string outerType, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier = null) { this.methodClassifier = methodClassifier; this.type = type; From 119ed95f8a6f12ec49d55043af5787a469733a69 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Mon, 4 Jul 2022 19:34:22 +0200 Subject: [PATCH 08/11] Update --- .../JavaCallableWrapperGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 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 afde1e484..c47e5d1f7 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 @@ -27,7 +27,7 @@ public enum JavaPeerStyle { public abstract class JavaCallableMethodClassifier { - public abstract bool ShouldBeDynamicallyRegistered (MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); + public abstract bool ShouldBeDynamicallyRegistered (TypeDefinition topType, MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); } public class JavaCallableWrapperGenerator { @@ -442,7 +442,7 @@ void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedM if (attr.Name.Contains ("-impl") || (attr.Name.Length > 7 && attr.Name[attr.Name.Length - 8] == '-')) Diagnostic.Error (4217, LookupSource (implementedMethod), Localization.Resources.JavaCallableWrappers_XA4217, attr.Name); - bool shouldBeDynamicallyRegistered = methodClassifier?.ShouldBeDynamicallyRegistered (registeredMethod, implementedMethod, attr.OriginAttribute) ?? true; + bool shouldBeDynamicallyRegistered = methodClassifier?.ShouldBeDynamicallyRegistered (type, registeredMethod, implementedMethod, attr.OriginAttribute) ?? true; var msig = new Signature (implementedMethod, attr, shouldBeDynamicallyRegistered); if (!registeredMethod.IsConstructor && !methods.Any (m => m.Name == msig.Name && m.Params == msig.Params)) methods.Add (msig); From 8c8938d39569a09abc7365e5cd1b29b53b1e3cda Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Fri, 8 Jul 2022 21:56:43 +0200 Subject: [PATCH 09/11] Fix up constructors --- .../JavaCallableWrapperGenerator.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 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 c47e5d1f7..b5d079a2f 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 @@ -70,15 +70,23 @@ public string GetJavaAccess () [Obsolete ("Use the TypeDefinitionCache overload for better performance.")] public JavaCallableWrapperGenerator (TypeDefinition type, Action log) - : this (type, null, log, resolver: null) + : this (type, log, resolver: null, methodClassifier: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, JavaCallableMethodClassifier methodClassifier = null) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache) + : this (type, log, (IMetadataResolver) cache, methodClassifier: null) + { } + + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, JavaCallableMethodClassifier methodClassifier) : this (type, log, (IMetadataResolver) cache, methodClassifier) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier = null) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver) + : this (type, log, resolver, methodClassifier: null) + { } + + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier) : this (type, null, log, resolver, methodClassifier) { if (type.HasNestedTypes) { From 6df5304e80d152510709e93a4c28dfd07e56a687 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 8 Jul 2022 20:14:08 -0400 Subject: [PATCH 10/11] Comment on #endif --- .../Android.Runtime/RegisterAttribute.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index 7f8e1a1b7..f13f81da2 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -39,7 +39,8 @@ public RegisterAttribute (string name, string signature, string connector, Custo } public CustomAttribute OriginAttribute { get; } -#endif +#endif // HAVE_CECIL + public string Connector { get { return connector; } set { connector = value; } From 9504dbc96d79d3854fc853eee63e8e92fe8b73df Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 8 Jul 2022 20:16:31 -0400 Subject: [PATCH 11/11] Reduce diff noise --- .../JavaCallableWrapperGenerator.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 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 b5d079a2f..06b0bba39 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 @@ -711,14 +711,13 @@ void GenerateBody (TextWriter sw) void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, string field) { - string managedTypeName = self.type.GetPartialAssemblyQualifiedName (cache); - string javaTypeName = $"{package}.{name}"; - if (!self.HasDynamicallyRegisteredMethods) { return; } sw.WriteLine ("\t\t{0} = ", field); + string managedTypeName = self.type.GetPartialAssemblyQualifiedName (cache); + string javaTypeName = $"{package}.{name}"; foreach (Signature method in self.methods) { if (method.IsDynamicallyRegistered) {