diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs b/tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs index 8f8922f82..f832421b5 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)));