From efceb89b98a3a05a4ff1e1cb713541756309f3d5 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 9 Mar 2021 11:03:53 +0100 Subject: [PATCH] Don't generate private members in compatibility mode in DefaultImpls --- .../kotlin/codegen/FunctionCodegen.java | 2 +- .../backend/jvm/lower/InterfaceLowering.kt | 9 +++++- .../localDelegatedProperties_ir.txt | 2 -- .../privateFunWithDefaultArg.kt | 2 -- .../privateFunWithDefaultArg2.txt | 31 +++++++++++++++++++ .../privateFunWithDefaultArg2_ir.txt | 31 +++++++++++++++++++ .../privateFunWithDefaultArg_ir.txt | 6 ---- 7 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2.txt create mode 100644 compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2_ir.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 49ad6118f17..897634124ef 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -1691,7 +1691,7 @@ public class FunctionCodegen { return (kind != OwnerKind.DEFAULT_IMPLS && !isSyntheticInCompatibilityOrJvmDefault) || (kind == OwnerKind.DEFAULT_IMPLS && (isSyntheticInCompatibilityOrJvmDefault || - (mode.isCompatibility() && !JvmAnnotationUtilKt.hasJvmDefaultNoCompatibilityAnnotation(containingDeclaration)))); + (mode.isCompatibility() && !JvmAnnotationUtilKt.hasJvmDefaultNoCompatibilityAnnotation(containingDeclaration))) && !DescriptorVisibilities.isPrivate(memberDescriptor.getVisibility())); } else { switch (kind) { case DEFAULT_IMPLS: return true; diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index 0f018ddd711..c91d7e6a82a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression @@ -150,7 +151,13 @@ internal class InterfaceLowering(val context: JvmBackendContext) : IrElementTran * 5) JVM default declaration is bridged in DefaultImpls via accessor if in compatibility mode, ... */ isCompatibilityMode -> { - createJvmDefaultCompatibilityDelegate(function) + val visibility = + if (function.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) + context.mapping.defaultArgumentsOriginalFunction[function]!!.visibility + else function.visibility + if (!DescriptorVisibilities.isPrivate(visibility)) { + createJvmDefaultCompatibilityDelegate(function) + } } // 6) ... otherwise we simply leave the default function implementation on the interface. diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/localDelegatedProperties_ir.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/localDelegatedProperties_ir.txt index 9f11b34ee9f..e28d0daa498 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/localDelegatedProperties_ir.txt +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/localDelegatedProperties_ir.txt @@ -8,7 +8,6 @@ public final class Delegate { @kotlin.Metadata public final class Foo$DefaultImpls { // source: 'localDelegatedProperties.kt' - private deprecated static @java.lang.Deprecated method test$lambda-0(p0: Delegate): java.lang.String public deprecated static @java.lang.Deprecated @org.jetbrains.annotations.NotNull method test(@org.jetbrains.annotations.NotNull p0: Foo): java.lang.String public final inner class Foo$DefaultImpls } @@ -19,7 +18,6 @@ public interface Foo { public synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[] static method (): void public synthetic static method access$test$jd(p0: Foo): java.lang.String - public synthetic static method access$test$lambda-0(p0: Delegate): java.lang.String private static method test$lambda-0(p0: Delegate): java.lang.String public @org.jetbrains.annotations.NotNull method test(): java.lang.String public final inner class Foo$DefaultImpls diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg.kt index 7b037fc484b..cb7dfc29343 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg.kt @@ -5,8 +5,6 @@ // WITH_COROUTINES // WITH_RUNTIME -// IGNORE_BACKEND: JVM - import helpers.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2.txt new file mode 100644 index 00000000000..88038ca0476 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2.txt @@ -0,0 +1,31 @@ +@kotlin.Metadata +public final class Foo$DefaultImpls { + // source: 'privateFunWithDefaultArg2.kt' + public deprecated static @java.lang.Deprecated @org.jetbrains.annotations.NotNull method bar(@org.jetbrains.annotations.NotNull p0: Foo): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public interface Foo { + // source: 'privateFunWithDefaultArg2.kt' + public synthetic static method access$bar$jd(p0: Foo): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String + public synthetic static method foo$default(p0: Foo, p1: java.lang.String, p2: int, p3: java.lang.Object): java.lang.String + private method foo(p0: java.lang.String): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public final class PrivateFunWithDefaultArg2Kt$box$1 { + // source: 'privateFunWithDefaultArg2.kt' + enclosing method PrivateFunWithDefaultArg2Kt.box()Ljava/lang/String; + inner (anonymous) class PrivateFunWithDefaultArg2Kt$box$1 + method (): void +} + +@kotlin.Metadata +public final class PrivateFunWithDefaultArg2Kt { + // source: 'privateFunWithDefaultArg2.kt' + inner (anonymous) class PrivateFunWithDefaultArg2Kt$box$1 + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2_ir.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2_ir.txt new file mode 100644 index 00000000000..88038ca0476 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg2_ir.txt @@ -0,0 +1,31 @@ +@kotlin.Metadata +public final class Foo$DefaultImpls { + // source: 'privateFunWithDefaultArg2.kt' + public deprecated static @java.lang.Deprecated @org.jetbrains.annotations.NotNull method bar(@org.jetbrains.annotations.NotNull p0: Foo): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public interface Foo { + // source: 'privateFunWithDefaultArg2.kt' + public synthetic static method access$bar$jd(p0: Foo): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String + public synthetic static method foo$default(p0: Foo, p1: java.lang.String, p2: int, p3: java.lang.Object): java.lang.String + private method foo(p0: java.lang.String): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public final class PrivateFunWithDefaultArg2Kt$box$1 { + // source: 'privateFunWithDefaultArg2.kt' + enclosing method PrivateFunWithDefaultArg2Kt.box()Ljava/lang/String; + inner (anonymous) class PrivateFunWithDefaultArg2Kt$box$1 + method (): void +} + +@kotlin.Metadata +public final class PrivateFunWithDefaultArg2Kt { + // source: 'privateFunWithDefaultArg2.kt' + inner (anonymous) class PrivateFunWithDefaultArg2Kt$box$1 + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg_ir.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg_ir.txt index 8e725cbe7d4..6283f7aee51 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg_ir.txt +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/privateFunWithDefaultArg_ir.txt @@ -1,12 +1,7 @@ @kotlin.Metadata public final class Foo$DefaultImpls { // source: 'privateFunWithDefaultArg.kt' - public synthetic final static method access$fooSuspend(p0: Foo, p1: java.lang.String, p2: kotlin.coroutines.Continuation): java.lang.Object public deprecated static @java.lang.Deprecated @org.jetbrains.annotations.NotNull method bar(@org.jetbrains.annotations.NotNull p0: Foo): java.lang.String - public synthetic static method foo$default(p0: Foo, p1: java.lang.String, p2: int, p3: java.lang.Object): java.lang.String - private deprecated static @java.lang.Deprecated method foo(p0: Foo, p1: java.lang.String): java.lang.String - public synthetic static method fooSuspend$default(p0: Foo, p1: java.lang.String, p2: kotlin.coroutines.Continuation, p3: int, p4: java.lang.Object): java.lang.Object - private deprecated static @java.lang.Deprecated method fooSuspend(p0: Foo, p1: java.lang.String, p2: kotlin.coroutines.Continuation): java.lang.Object public final inner class Foo$DefaultImpls } @@ -32,7 +27,6 @@ public interface Foo { // source: 'privateFunWithDefaultArg.kt' inner (anonymous) class Foo$bar$1 public synthetic static method access$bar$jd(p0: Foo): java.lang.String - public synthetic static method access$foo(p0: Foo, p1: java.lang.String): java.lang.String public synthetic static method access$fooSuspend(p0: Foo, p1: java.lang.String, p2: kotlin.coroutines.Continuation): java.lang.Object public @org.jetbrains.annotations.NotNull method bar(): java.lang.String public synthetic static method foo$default(p0: Foo, p1: java.lang.String, p2: int, p3: java.lang.Object): java.lang.String