diff --git a/src/Xamarin.Android.Tools.Bytecode/Kotlin/KotlinFixups.cs b/src/Xamarin.Android.Tools.Bytecode/Kotlin/KotlinFixups.cs index 110022fa2..95eb8c871 100644 --- a/src/Xamarin.Android.Tools.Bytecode/Kotlin/KotlinFixups.cs +++ b/src/Xamarin.Android.Tools.Bytecode/Kotlin/KotlinFixups.cs @@ -66,6 +66,16 @@ static void FixupClassVisibility (ClassFile klass, KotlinClass metadata) { // Hide class if it isn't Public/Protected if (klass.AccessFlags.IsPubliclyVisible () && !metadata.Visibility.IsPubliclyVisible ()) { + + // Interfaces should be set to "package-private", which is "no visibility flags" + if (klass.AccessFlags.HasFlag (ClassAccessFlags.Interface)) { + Log.Debug ($"Kotlin: Setting interface {klass.ThisClass.Name.Value} to package-private"); + klass.AccessFlags = (klass.AccessFlags ^ ClassAccessFlags.Public) & klass.AccessFlags; + klass.AccessFlags = (klass.AccessFlags ^ ClassAccessFlags.Protected) & klass.AccessFlags; + klass.AccessFlags = (klass.AccessFlags ^ ClassAccessFlags.Private) & klass.AccessFlags; + return; + } + Log.Debug ($"Kotlin: Hiding internal class {klass.ThisClass.Name.Value}"); klass.AccessFlags = ClassAccessFlags.Private; return; diff --git a/tests/Xamarin.Android.Tools.Bytecode-Tests/KotlinFixupsTests.cs b/tests/Xamarin.Android.Tools.Bytecode-Tests/KotlinFixupsTests.cs index 2ce39a269..ddaf5c9e6 100644 --- a/tests/Xamarin.Android.Tools.Bytecode-Tests/KotlinFixupsTests.cs +++ b/tests/Xamarin.Android.Tools.Bytecode-Tests/KotlinFixupsTests.cs @@ -23,6 +23,21 @@ public void HideInternalClass () Assert.False (klass.AccessFlags.HasFlag (ClassAccessFlags.Public)); } + [Test] + public void MakeInternalInterfacePackagePrivate () + { + var klass = LoadClassFile ("InternalInterface.class"); + + Assert.True (klass.AccessFlags.HasFlag (ClassAccessFlags.Public)); + + KotlinFixups.Fixup (new [] { klass }); + + // "package-private" is denoted as no visibility flags + Assert.False (klass.AccessFlags.HasFlag (ClassAccessFlags.Public)); + Assert.False (klass.AccessFlags.HasFlag (ClassAccessFlags.Protected)); + Assert.False (klass.AccessFlags.HasFlag (ClassAccessFlags.Private)); + } + [Test] public void HideInternalConstructor () { diff --git a/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.class b/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.class new file mode 100644 index 000000000..f00e1ca4a Binary files /dev/null and b/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.class differ diff --git a/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.kt b/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.kt new file mode 100644 index 000000000..382d3537c --- /dev/null +++ b/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.kt @@ -0,0 +1 @@ +internal interface InternalInterface \ No newline at end of file