diff --git a/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs b/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs index 9f2e132dd..f9b3bf4ae 100644 --- a/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs +++ b/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs @@ -103,6 +103,7 @@ namespace Java.Interop.Tools.Diagnostics { // XA4210 "You need to add a reference to Mono.Android.Export.dll when you use ExportAttribute or ExportFieldAttribute." // XA4211 AndroidManifest.xml //uses-sdk/@android:targetSdkVersion '{0}' is less than $(TargetFrameworkVersion) '{1}'. Using API-{1} for ACW compilation. // XA4212 Type `{0}` implements `Android.Runtime.IJavaObject` but does not inherit `Java.Lang.Object` or `Java.Lang.Throwable`. This is not supported. + // XA4213 Cannot override Kotlin-generated method '{0}' because it is not a valid Java method name. This method can only be overridden from Kotlin." // XA5xxx GCC and toolchain // XA32xx .apk generation // XA4300 Unsupported $(AndroidSupportedAbis) value '{0}'; ignoring. 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 6f9fa1f1c..52d70f2ba 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 @@ -362,6 +362,10 @@ void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedM { if (registeredMethod != null) foreach (RegisterAttribute attr in GetRegisterAttributes (registeredMethod)) { + // Check for Kotlin-mangled methods that cannot be overridden + if (attr.Name.Contains ("-impl") || (attr.Name.Length > 7 && attr.Name[attr.Name.Length - 8] == '-')) + Diagnostic.Error (4213, LookupSource (implementedMethod), $"Cannot override Kotlin-generated method '{attr.Name}' because it is not a valid Java method name. This method can only be overridden from Kotlin."); + var msig = new Signature (implementedMethod, attr); if (!registeredMethod.IsConstructor && !methods.Any (m => m.Name == msig.Name && m.Params == msig.Params)) methods.Add (msig); diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs index 2bc2bd2ed..b1af2f44d 100644 --- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs +++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs @@ -30,6 +30,28 @@ public void ConstructorExceptions () Assert.AreEqual (4200, e.Code); } + [Test] + public void KotlinInvalidImplRegisterName () + { + Action logger = (f, o) => { }; + + // Contains invalid [Register] name of "foo-impl" + var td = SupportDeclarations.GetTypeDefinition (typeof (KotlinInvalidImplRegisterName)); + var e = Assert.Throws (() => new JavaCallableWrapperGenerator (td, logger)); + Assert.AreEqual (4213, e.Code); + } + + [Test] + public void KotlinInvalidHashRegisterName () + { + Action logger = (f, o) => { }; + + // Contains invalid [Register] name of "foo-f8k2a13" + var td = SupportDeclarations.GetTypeDefinition (typeof (KotlinInvalidHashRegisterName)); + var e = Assert.Throws (() => new JavaCallableWrapperGenerator (td, logger)); + Assert.AreEqual (4213, e.Code); + } + [Test] public void GenerateApplication ( [Values (null, "android.app.Application", "android.support.multidex.MultiDexApplication")] string applicationJavaClass diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs index 341b62a34..4d8c228be 100644 --- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs +++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/SupportDeclarations.cs @@ -227,6 +227,34 @@ public class OverrideNestedName : Java.Lang.Object } } + [Register ("Kotlin.InvalidRegisterName")] + class KotlinInvalidRegisterName : Java.Lang.Object + { + [Register ("foo-impl")] + public virtual void Foo () + { + } + + [Register ("foo-f8k2a13")] + public virtual void Bar () + { + } + } + + [Register ("Kotlin.InvalidRegisterNameSubclass")] + class KotlinInvalidImplRegisterName : KotlinInvalidRegisterName + { + [Register ("foo-impl")] + public override void Foo () => base.Foo (); + } + + [Register ("Kotlin.InvalidRegisterNameSubclass")] + class KotlinInvalidHashRegisterName : KotlinInvalidRegisterName + { + [Register ("foo-f8k2a13")] + public override void Bar () => base.Foo (); + } + [Service (Name = "service.Name")] class ServiceName : Java.Lang.Object {