From b02948b5f763cd313a7461d7ed3bc8066a94ed32 Mon Sep 17 00:00:00 2001 From: Nicklas Ansman Giertz Date: Wed, 14 Sep 2022 16:30:59 -0400 Subject: [PATCH] KAPT: Kapt generates illegal stubs for private interface methods Interface methods that were private got both the `default` and `private` modifiers when using `jvm-default=all` which is not valid. The stub will now just contain `private` in this case. This fixes KT-48013. --- .../kapt3/stubs/ClassFileToSourceStubConverter.kt | 2 +- .../kapt3-compiler/testData/converter/jvmDefaultAll.kt | 5 +++++ .../testData/converter/jvmDefaultAll.txt | 3 +++ .../testData/converter/jvmDefaultAllCompatibility.kt | 5 +++++ .../testData/converter/jvmDefaultAllCompatibility.txt | 3 +++ .../testData/converter/jvmDefaultDisable.kt | 10 ++++++++++ .../testData/converter/jvmDefaultDisable.txt | 7 +++++++ .../testData/converter/jvmDefaultEnable.kt | 10 ++++++++++ .../testData/converter/jvmDefaultEnable.txt | 7 +++++++ 9 files changed, 51 insertions(+), 1 deletion(-) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 39b860afa8b..0d88e717dec 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -915,7 +915,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati ElementKind.METHOD, packageFqName, visibleAnnotations, method.invisibleAnnotations, descriptor.annotations ) - if (containingClass.isInterface() && !method.isAbstract() && !method.isStatic()) { + if (containingClass.isInterface() && !method.isAbstract() && !method.isStatic() && (method.access and Opcodes.ACC_PRIVATE == 0)) { modifiers.flags = modifiers.flags or Flags.DEFAULT } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.kt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.kt index 0246b4ae567..a26ab9b6328 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.kt @@ -1,4 +1,5 @@ // !JVM_DEFAULT_MODE: all +// EXPECTED_ERROR: (kotlin:15:5) modifier private not allowed here interface Foo { fun foo() { @@ -10,4 +11,8 @@ interface Foo { } fun bar() + + private fun privateMethodWithDefault() { + System.out.println("privateMethodWithDefault") + } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.txt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.txt index 9deab10689b..8f465117ff3 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAll.txt @@ -10,4 +10,7 @@ public abstract interface Foo { } public abstract void bar(); + + private void privateMethodWithDefault() { + } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.kt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.kt index 2824f661bdd..b5d9feb1f1c 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.kt @@ -1,4 +1,5 @@ // !JVM_DEFAULT_MODE: all-compatibility +// EXPECTED_ERROR: (kotlin:15:5) modifier private not allowed here interface Foo { fun foo() { @@ -10,4 +11,8 @@ interface Foo { } fun bar() + + private fun privateMethodWithDefault() { + System.out.println("privateMethodWithDefault") + } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.txt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.txt index 2f19e15188d..554b8bfcf09 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultAllCompatibility.txt @@ -11,6 +11,9 @@ public abstract interface Foo { public abstract void bar(); + private void privateMethodWithDefault() { + } + @kotlin.Metadata() public static final class DefaultImpls { diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.kt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.kt index ea328e598dc..5f68e3deb23 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.kt @@ -1,4 +1,5 @@ // !JVM_DEFAULT_MODE: disable +// EXPECTED_ERROR: (kotlin:20:5) modifier private not allowed here interface Foo { fun foo() { @@ -11,4 +12,13 @@ interface Foo { } fun bar() + + private fun privateMethodWithDefault() { + System.out.println("privateMethodWithDefault") + } + + @JvmDefault + private fun privateMethodWithDefault2() { + System.out.println("privateMethodWithDefault2") + } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.txt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.txt index 034dede7791..7873b6ac355 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultDisable.txt @@ -11,6 +11,10 @@ public abstract interface Foo { public abstract void bar(); + @kotlin.jvm.JvmDefault() + private void privateMethodWithDefault2() { + } + @kotlin.Metadata() public static final class DefaultImpls { @@ -21,5 +25,8 @@ public abstract interface Foo { public static void foo(@org.jetbrains.annotations.NotNull() Foo $this) { } + + private static void privateMethodWithDefault(Foo $this) { + } } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.kt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.kt index 59d095b8860..d87e348f596 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.kt @@ -1,4 +1,5 @@ // !JVM_DEFAULT_MODE: enable +// EXPECTED_ERROR: (kotlin:20:5) modifier private not allowed here interface Foo { fun foo() { @@ -11,4 +12,13 @@ interface Foo { } fun bar() + + private fun privateMethodWithDefault() { + System.out.println("privateMethodWithDefault") + } + + @JvmDefault + private fun privateMethodWithDefault2() { + System.out.println("privateMethodWithDefault2") + } } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.txt b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.txt index 034dede7791..7873b6ac355 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/jvmDefaultEnable.txt @@ -11,6 +11,10 @@ public abstract interface Foo { public abstract void bar(); + @kotlin.jvm.JvmDefault() + private void privateMethodWithDefault2() { + } + @kotlin.Metadata() public static final class DefaultImpls { @@ -21,5 +25,8 @@ public abstract interface Foo { public static void foo(@org.jetbrains.annotations.NotNull() Foo $this) { } + + private static void privateMethodWithDefault(Foo $this) { + } } }