Use compatibility accessors only in compatibility stubs

This commit is contained in:
Mikhael Bogdanov
2021-03-09 15:51:13 +01:00
committed by Space
parent efceb89b98
commit 66a29c70bf
8 changed files with 130 additions and 1 deletions
@@ -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 {
@@ -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()
@@ -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()
}
@@ -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 <init>(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 <init>(): 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
}
@@ -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 <init>(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 <init>(): 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
}
@@ -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 {
@@ -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 {
@@ -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)