Skip to content

Commit c694313

Browse files
committed
[generator] Allow 'managedOverride' metadata to support 'abstract' methods.
1 parent 77800dd commit c694313

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

src/Xamarin.SourceWriter/Models/MethodWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public virtual void WriteSignature (CodeWriter writer)
8888

8989
if (IsOverride)
9090
writer.Write ("override ");
91-
else if (IsVirtual)
91+
92+
if (IsVirtual)
9293
writer.Write ("virtual ");
9394
else if (IsAbstract)
9495
writer.Write ("abstract ");

tests/generator-Tests/Unit-Tests/CodeGeneratorTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,30 @@ public void ManagedOverrideMethod_Override ()
150150
Assert.True (writer.ToString ().Contains ("public override unsafe int DoStuff ()"), $"was: `{writer.ToString ()}`");
151151
}
152152

153+
[Test]
154+
public void ManagedOverrideAbstractMethod_Override ()
155+
{
156+
var xml = @"<api>
157+
<package name='java.lang' jni-name='java/lang'>
158+
<class abstract='false' deprecated='not deprecated' final='false' name='Object' static='false' visibility='public' jni-signature='Ljava/lang/Object;' />
159+
</package>
160+
<package name='com.xamarin.android' jni-name='com/xamarin/android'>
161+
<class abstract='false' deprecated='not deprecated' extends='java.lang.Object' extends-generic-aware='java.lang.Object' jni-extends='Ljava/lang/Object;' final='false' name='MyClass' static='false' visibility='public' jni-signature='Lcom/xamarin/android/MyClass;'>
162+
<method abstract='true' deprecated='not deprecated' final='true' name='DoStuff' jni-signature='()I' bridge='false' native='false' return='int' jni-return='I' static='false' synchronized='false' synthetic='false' visibility='public' managedOverride='override'></method>
163+
</class>
164+
</package>
165+
</api>";
166+
167+
var gens = ParseApiDefinition (xml);
168+
var klass = gens.Single (g => g.Name == "MyClass");
169+
170+
generator.Context.ContextTypes.Push (klass);
171+
generator.WriteType (klass, string.Empty, new GenerationInfo ("", "", "MyAssembly"));
172+
generator.Context.ContextTypes.Pop ();
173+
174+
Assert.True (writer.ToString ().Contains ("public override abstract int DoStuff ();"), $"was: `{writer}`");
175+
}
176+
153177
[Test]
154178
public void ManagedOverrideMethod_None ()
155179
{

tools/generator/SourceWriters/BoundMethodAbstractDeclaration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public BoundMethodAbstractDeclaration (GenBase gen, Method method, CodeGeneratio
4444

4545
NewFirst = true;
4646

47+
if (method.ManagedOverride?.ToLowerInvariant () == "override")
48+
IsOverride = true;
49+
4750
if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) {
4851
method_callback = new MethodCallback (impl, method, opt, null, method.IsReturnCharSequence);
4952
}

0 commit comments

Comments
 (0)