From 8a86aee02c47bd80b811c94fa6a6ac317d73125c Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Thu, 14 May 2020 10:56:14 -0500 Subject: [PATCH] [XAT.Bytecode] Kotlin internal interfaces need to be set to package-private. --- .../Kotlin/KotlinFixups.cs | 10 ++++++++++ .../KotlinFixupsTests.cs | 15 +++++++++++++++ .../kotlin/InternalInterface.class | Bin 0 -> 318 bytes .../kotlin/InternalInterface.kt | 1 + 4 files changed, 26 insertions(+) create mode 100644 tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.class create mode 100644 tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin/InternalInterface.kt 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 0000000000000000000000000000000000000000..f00e1ca4ae5b182f58d3b18c563f8e3741e4d834 GIT binary patch literal 318 zcmZWj%TB{U3>|f}IG~>SC{!mB zr`ne78QEk1{(b)dNHHZ0GwapHO4HR(S*j33h*xqa6C>?c@>;A^=|coOyr>&*v`t== zmzDJLi6GXyfW@dy1BOKh(L&y!nyKo6Fg@)1k(h}{#N2(%4*OKx^C3~Cgz@6!3sweU za>C!$o)En^+fAwF+9<;9+tzx$R!i-4Vbrs=jh9|G*7aB(XZ%QO0^=@^FyZ>h;^*wW e96^S#i#{&?QIz2lSIpu%2RYnekV81c4#OjU`a>)L literal 0 HcmV?d00001 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