From 66a29c70bf033b2ed34e057cadc70c61ac562ecc Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 9 Mar 2021 15:51:13 +0100 Subject: [PATCH] Use compatibility accessors only in compatibility stubs --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++ .../jvm/lower/SyntheticAccessorLowering.kt | 4 +- .../defaults/allCompatibility/superCall.kt | 26 +++++++++++++ .../defaults/allCompatibility/superCall.txt | 39 +++++++++++++++++++ .../allCompatibility/superCall_ir.txt | 39 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ 8 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt create mode 100644 compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.txt create mode 100644 compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall_ir.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 2d0a0675ff5..c910662c044 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -22092,6 +22092,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/simpleFunction.kt"); } + @Test + @TestMetadata("superCall.kt") + public void testSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt"); + } + @Test @TestMetadata("suspendFunction.kt") public void testSuspendFunction() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 973a1a77445..96e920d1173 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -575,7 +575,9 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle // The only function accessors placed on interfaces are for private functions and JvmDefault implementations. // The two cannot clash. - parentAsClass.isJvmInterface -> if (!DescriptorVisibilities.isPrivate(visibility)) "\$jd" else "" + currentClass?.irElement?.let { element -> + element is IrClass && element.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS && element.parentAsClass == parentAsClass + } ?: false -> if (!DescriptorVisibilities.isPrivate(visibility)) "\$jd" else "" // Accessor for _s_uper-qualified call superQualifier != null -> "\$s" + superQualifier.owner.syntheticAccessorToSuperSuffix() diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt new file mode 100644 index 00000000000..0e9cc2b05dc --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt @@ -0,0 +1,26 @@ +// CHECK_BYTECODE_LISTING +// IGNORE_BACKEND_FIR: JVM_IR +// !JVM_DEFAULT_MODE: all-compatibility +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_COROUTINES +// WITH_RUNTIME + +interface Foo { + + fun bar(): String { + return "OK" + } +} + +class FooClass : Foo { + override fun bar(): String { + return object { + fun run()= super@FooClass.bar() + }.run() + } +} + +fun box(): String { + return FooClass().bar() +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.txt new file mode 100644 index 00000000000..2753bb64f75 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.txt @@ -0,0 +1,39 @@ +@kotlin.Metadata +public final class Foo$DefaultImpls { + // source: 'superCall.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: 'superCall.kt' + public synthetic static method access$bar$jd(p0: Foo): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public final class FooClass$bar$1 { + // source: 'superCall.kt' + enclosing method FooClass.bar()Ljava/lang/String; + synthetic final field this$0: FooClass + inner (anonymous) class FooClass$bar$1 + method (p0: FooClass): void + public final @org.jetbrains.annotations.NotNull method run(): java.lang.String +} + +@kotlin.Metadata +public final class FooClass { + // source: 'superCall.kt' + inner (anonymous) class FooClass$bar$1 + public method (): void + public synthetic final static method access$bar$s414358642(p0: FooClass): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String +} + +@kotlin.Metadata +public final class SuperCallKt { + // source: 'superCall.kt' + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall_ir.txt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall_ir.txt new file mode 100644 index 00000000000..3affda1e93b --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall_ir.txt @@ -0,0 +1,39 @@ +@kotlin.Metadata +public final class Foo$DefaultImpls { + // source: 'superCall.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: 'superCall.kt' + public synthetic static method access$bar$jd(p0: Foo): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String + public final inner class Foo$DefaultImpls +} + +@kotlin.Metadata +public final class FooClass$bar$1 { + // source: 'superCall.kt' + enclosing method FooClass.bar()Ljava/lang/String; + synthetic final field this$0: FooClass + inner (anonymous) class FooClass$bar$1 + method (p0: FooClass): void + public final @org.jetbrains.annotations.NotNull method run(): java.lang.String +} + +@kotlin.Metadata +public final class FooClass { + // source: 'superCall.kt' + inner (anonymous) class FooClass$bar$1 + public method (): void + public synthetic final static method access$bar$s70822(p0: FooClass): java.lang.String + public @org.jetbrains.annotations.NotNull method bar(): java.lang.String +} + +@kotlin.Metadata +public final class SuperCallKt { + // source: 'superCall.kt' + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 10af12d2f33..125d2062fcb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -22092,6 +22092,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/simpleFunction.kt"); } + @Test + @TestMetadata("superCall.kt") + public void testSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt"); + } + @Test @TestMetadata("suspendFunction.kt") public void testSuspendFunction() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index fc77358774e..57b232fe3e5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -22092,6 +22092,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/simpleFunction.kt"); } + @Test + @TestMetadata("superCall.kt") + public void testSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt"); + } + @Test @TestMetadata("suspendFunction.kt") public void testSuspendFunction() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 01b0cfd0c13..730c9aca0f2 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -18596,6 +18596,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/simpleFunction.kt"); } + @TestMetadata("superCall.kt") + public void testSuperCall() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/superCall.kt"); + } + @TestMetadata("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/delegationBy") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)