From b876f2eac6b3cb3472ac0fca88debc7a037045d9 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Fri, 28 Aug 2020 09:54:20 -0500 Subject: [PATCH 1/2] [generator] Add 'managedOverride' metadata to allow user to force 'override'/'virtual'. --- .../Unit-Tests/CodeGeneratorTests.cs | 96 +++++++++++++++++++ .../XmlApiImporter.cs | 1 + .../Method.cs | 1 + tools/generator/SourceWriters/BoundMethod.cs | 9 ++ .../generator/SourceWriters/BoundProperty.cs | 9 ++ 5 files changed, 116 insertions(+) diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 8f8922f82..564ba3a41 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs @@ -99,6 +99,102 @@ public void WriteKotlinUnsignedArrayTypePropertiesClass () Assert.AreEqual (GetTargetedExpected (nameof (WriteKotlinUnsignedArrayTypePropertiesClass)), writer.ToString ().NormalizeLineEndings ()); } + + [Test] + public void ManagedOverrideMethod_Virtual () + { + var xml = @" + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var klass = gens.Single (g => g.Name == "MyClass"); + + generator.Context.ContextTypes.Push (klass); + generator.WriteType (klass, string.Empty, new GenerationInfo ("", "", "MyAssembly")); + generator.Context.ContextTypes.Pop (); + + Assert.True (writer.ToString ().Contains ("public virtual unsafe int DoStuff ()")); + } + + [Test] + public void ManagedOverrideMethod_Override () + { + var xml = @" + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var klass = gens.Single (g => g.Name == "MyClass"); + + generator.Context.ContextTypes.Push (klass); + generator.WriteType (klass, string.Empty, new GenerationInfo ("", "", "MyAssembly")); + generator.Context.ContextTypes.Pop (); + + Assert.True (writer.ToString ().Contains ("public override unsafe int DoStuff ()")); + } + + [Test] + public void ManagedOverrideProperty_Virtual () + { + var xml = @" + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var klass = gens.Single (g => g.Name == "MyClass"); + + generator.Context.ContextTypes.Push (klass); + generator.WriteType (klass, string.Empty, new GenerationInfo ("", "", "MyAssembly")); + generator.Context.ContextTypes.Pop (); + + Assert.True (writer.ToString ().Contains ("public virtual unsafe int Name {")); + } + + [Test] + public void ManagedOverrideProperty_Override () + { + var xml = @" + + + + + + + + + "; + + var gens = ParseApiDefinition (xml); + var klass = gens.Single (g => g.Name == "MyClass"); + + generator.Context.ContextTypes.Push (klass); + generator.WriteType (klass, string.Empty, new GenerationInfo ("", "", "MyAssembly")); + generator.Context.ContextTypes.Pop (); + + Assert.True (writer.ToString ().Contains ("public override unsafe int Name {")); + } } [TestFixture] diff --git a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs index 39c6694a7..32ad809eb 100644 --- a/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs +++ b/tools/generator/Java.Interop.Tools.Generator.Importers/XmlApiImporter.cs @@ -256,6 +256,7 @@ public static Method CreateMethod (GenBase declaringType, XElement elem) IsReturnEnumified = elem.Attribute ("enumReturn") != null, IsStatic = elem.XGetAttribute ("static") == "true", JavaName = elem.XGetAttribute ("name"), + ManagedOverride = elem.XGetAttribute ("managedOverride"), ManagedReturn = elem.XGetAttribute ("managedReturn"), PropertyNameOverride = elem.XGetAttribute ("propertyName"), Return = elem.XGetAttribute ("return"), diff --git a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Method.cs b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Method.cs index cc745390c..6f95ce665 100644 --- a/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Method.cs +++ b/tools/generator/Java.Interop.Tools.Generator.ObjectModel/Method.cs @@ -26,6 +26,7 @@ public Method (GenBase declaringType) : base (declaringType) public bool IsStatic { get; set; } public bool IsVirtual { get; set; } public string JavaName { get; set; } + public string ManagedOverride { get; set; } public string ManagedReturn { get; set; } public string PropertyNameOverride { get; set; } public string Return { get; set; } diff --git a/tools/generator/SourceWriters/BoundMethod.cs b/tools/generator/SourceWriters/BoundMethod.cs index 4a92b20fd..aabec6f69 100644 --- a/tools/generator/SourceWriters/BoundMethod.cs +++ b/tools/generator/SourceWriters/BoundMethod.cs @@ -44,6 +44,15 @@ public BoundMethod (GenBase type, Method method, CodeGenerationOptions opt, bool if ((IsVirtual || !IsOverride) && type.RequiresNew (method.AdjustedName, method)) IsShadow = true; + // Allow user to override our virtual/override logic + if (method.ManagedOverride?.ToLowerInvariant () == "virtual") { + IsVirtual = true; + IsOverride = false; + } else if (method.ManagedOverride?.ToLowerInvariant () == "override") { + IsVirtual = false; + IsOverride = true; + } + ReturnType = new TypeReferenceWriter (opt.GetTypeReferenceName (method.RetVal)); if (method.DeclaringType.IsGeneratable) diff --git a/tools/generator/SourceWriters/BoundProperty.cs b/tools/generator/SourceWriters/BoundProperty.cs index ce1896e79..fbcac7150 100644 --- a/tools/generator/SourceWriters/BoundProperty.cs +++ b/tools/generator/SourceWriters/BoundProperty.cs @@ -55,6 +55,15 @@ public BoundProperty (GenBase gen, Property property, CodeGenerationOptions opt, } } + // Allow user to override our virtual/override logic + if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant () == "virtual") { + IsVirtual = true; + IsOverride = false; + } else if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant () == "override") { + IsVirtual = false; + IsOverride = true; + } + // Unlike [Register], [Obsolete] cannot be put on property accessors, so we can apply them only under limited condition... if (property.Getter.Deprecated != null && (property.Setter == null || property.Setter.Deprecated != null)) Attributes.Add (new ObsoleteAttr (property.Getter.Deprecated.Replace ("\"", "\"\"").Trim () + (property.Setter != null && property.Setter.Deprecated != property.Getter.Deprecated ? " " + property.Setter.Deprecated.Replace ("\"", "\"\"").Trim () : null))); From 029694bf49cd13420b4546589607343b0c6e5ce0 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 28 Aug 2020 14:11:58 -0400 Subject: [PATCH 2/2] Ensure //class/@name is consistent w/ //class/@jni-signature --- tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 564ba3a41..f832421b5 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs @@ -105,7 +105,7 @@ public void ManagedOverrideMethod_Virtual () { var xml = @" - + @@ -129,7 +129,7 @@ public void ManagedOverrideMethod_Override () { var xml = @" - + @@ -153,7 +153,7 @@ public void ManagedOverrideProperty_Virtual () { var xml = @" - + @@ -177,7 +177,7 @@ public void ManagedOverrideProperty_Override () { var xml = @" - +