From 60f2dbeb8af36358e554ed1aa779d7f0ea68ef07 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 28 May 2018 20:47:12 +0200 Subject: [PATCH] Support property accessor in compatibility mode --- .../codegen/context/CodegenContext.java | 9 +++++- .../compatibility/propertyAnnotation.kt | 24 +++++++++++++++ .../compatibility/propertyAccessors.kt | 29 +++++++++++++++++++ ...BlackBoxWithJava8CodegenTestGenerated.java | 5 ++++ .../flags/WriteFlagsTestGenerated.java | 28 ++++++++++++++++++ 5 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/propertyAnnotation.kt create mode 100644 compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAccessors.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index bb1151cc600..e9eeccfd476 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -410,6 +410,13 @@ public abstract class CodegenContext { public D getAccessorForJvmDefaultCompatibility(@NotNull D descriptor) { + if (descriptor instanceof PropertyAccessorDescriptor) { + PropertyDescriptor propertyAccessor = getAccessor(((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty(), + AccessorKind.JVM_DEFAULT_COMPATIBILITY, null, null, + descriptor instanceof PropertyGetterDescriptor, + descriptor instanceof PropertySetterDescriptor); + return descriptor instanceof PropertyGetterDescriptor ? (D) propertyAccessor.getGetter() : (D) propertyAccessor.getSetter(); + } return getAccessor(descriptor, AccessorKind.JVM_DEFAULT_COMPATIBILITY, null, null); } @@ -491,7 +498,7 @@ public abstract class CodegenContext { } else if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; - if (accessorKind == AccessorKind.NORMAL) { + if (accessorKind == AccessorKind.NORMAL || accessorKind == AccessorKind.JVM_DEFAULT_COMPATIBILITY) { AccessorForPropertyDescriptorFactory factory = new AccessorForPropertyDescriptorFactory(propertyDescriptor, contextDescriptor, superCallTarget, nameSuffix, accessorKind); propertyAccessorFactories.put(key, factory); diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/propertyAnnotation.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/propertyAnnotation.kt new file mode 100644 index 00000000000..b446816cc8a --- /dev/null +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/propertyAnnotation.kt @@ -0,0 +1,24 @@ +// !API_VERSION: 1.3 +// !JVM_DEFAULT_MODE: compatibility +// JVM_TARGET: 1.8 +// WITH_REFLECT + +annotation class Property(val value: String) +annotation class Accessor(val value: String) + +interface Z { + @Property("OK") + @JvmDefault + val z: String + @Accessor("OK") + get() = "OK" +} + + +class Test : Z + +fun box() : String { + val value = Z::z.annotations.filterIsInstance().single().value + if (value != "OK") return value + return (Z::z.getter.annotations.single() as Accessor).value +} \ No newline at end of file diff --git a/compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAccessors.kt b/compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAccessors.kt new file mode 100644 index 00000000000..8025ad01dc3 --- /dev/null +++ b/compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAccessors.kt @@ -0,0 +1,29 @@ +// !API_VERSION: 1.3 +// !JVM_DEFAULT_MODE: compatibility +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + @JvmDefault + val test: String + get() = "OK" + + @JvmDefault + var test2: String + get() = "OK" + set(field) {} +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test, access$getTest$jd$jd +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test, access$getTest2$jd$jd +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC + + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test, access$setTest2$jd$jd +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC + diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java index dbfb3514cde..2d9f93d8d7e 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java @@ -518,6 +518,11 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg runTest("compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/inheritedJvmDefault.kt"); } + @TestMetadata("propertyAnnotation.kt") + public void testPropertyAnnotation() throws Exception { + runTest("compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/propertyAnnotation.kt"); + } + @TestMetadata("simpleFunction.kt") public void testSimpleFunction() throws Exception { runTest("compiler/testData/codegen/java8/box/jvm8/defaults/compatibility/simpleFunction.kt"); diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 5fb5b62fcdc..e18cd27b064 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -60,5 +60,33 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { public void testDefaultProperty() throws Exception { runTest("compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt"); } + + @TestMetadata("propertyAnnotation.kt") + public void testPropertyAnnotation() throws Exception { + runTest("compiler/testData/codegen/java8/writeFlags/defaults/propertyAnnotation.kt"); + } + + @TestMetadata("compiler/testData/codegen/java8/writeFlags/defaults/compatibility") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Compatibility extends AbstractWriteFlagsTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInCompatibility() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/java8/writeFlags/defaults/compatibility"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("propertyAccessors.kt") + public void testPropertyAccessors() throws Exception { + runTest("compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAccessors.kt"); + } + + @TestMetadata("propertyAnnotation.kt") + public void testPropertyAnnotation() throws Exception { + runTest("compiler/testData/codegen/java8/writeFlags/defaults/compatibility/propertyAnnotation.kt"); + } + } } }