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)));