From f56dc722d9d6973ca89c47be960d39f2b6484166 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 22 Dec 2015 19:14:32 +0300 Subject: [PATCH] Lateinit property backing field now inherits visibility from the property setter --- .../kotlin/codegen/PropertyCodegen.java | 5 ++++ .../writeFlags/lateinit/lateinitGetter.kt | 8 ++++++ .../writeFlags/lateinit/lateinitProperty.kt | 8 ++++++ .../lateinit/lateinitPropertyNoSetter.kt | 7 +++++ .../flags/WriteFlagsTestGenerated.java | 27 +++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 compiler/testData/writeFlags/lateinit/lateinitGetter.kt create mode 100644 compiler/testData/writeFlags/lateinit/lateinitProperty.kt create mode 100644 compiler/testData/writeFlags/lateinit/lateinitPropertyNoSetter.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 2e009a0d80c..023dd91bdaa 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -311,6 +311,7 @@ public class PropertyCodegen { FieldOwnerContext backingFieldContext = context; boolean takeVisibilityFromDescriptor = propertyDescriptor.isLateInit() || propertyDescriptor.isConst(); + boolean takeVisibilityFromSetter = propertyDescriptor.isLateInit() && propertyDescriptor.getSetter() != null; if (AsmUtil.isInstancePropertyWithStaticBackingField(propertyDescriptor) ) { modifiers |= ACC_STATIC; @@ -338,6 +339,10 @@ public class PropertyCodegen { modifiers |= ACC_DEPRECATED; } } + else if (takeVisibilityFromSetter) { + // For lateinits, we take visibility from setter, if any + modifiers |= getVisibilityAccessFlag(propertyDescriptor.getSetter()); + } else if (takeVisibilityFromDescriptor) { modifiers |= getVisibilityAccessFlag(propertyDescriptor); } diff --git a/compiler/testData/writeFlags/lateinit/lateinitGetter.kt b/compiler/testData/writeFlags/lateinit/lateinitGetter.kt new file mode 100644 index 00000000000..53ce2a3ac04 --- /dev/null +++ b/compiler/testData/writeFlags/lateinit/lateinitGetter.kt @@ -0,0 +1,8 @@ +class My { + lateinit var s: String + private set +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: My, getS +// FLAGS: ACC_PUBLIC, ACC_FINAL diff --git a/compiler/testData/writeFlags/lateinit/lateinitProperty.kt b/compiler/testData/writeFlags/lateinit/lateinitProperty.kt new file mode 100644 index 00000000000..11a00b4b81d --- /dev/null +++ b/compiler/testData/writeFlags/lateinit/lateinitProperty.kt @@ -0,0 +1,8 @@ +class My { + lateinit var s: String + private set +} + +// TESTED_OBJECT_KIND: property +// TESTED_OBJECTS: My, s +// FLAGS: ACC_PRIVATE diff --git a/compiler/testData/writeFlags/lateinit/lateinitPropertyNoSetter.kt b/compiler/testData/writeFlags/lateinit/lateinitPropertyNoSetter.kt new file mode 100644 index 00000000000..6c9119b26a6 --- /dev/null +++ b/compiler/testData/writeFlags/lateinit/lateinitPropertyNoSetter.kt @@ -0,0 +1,7 @@ +class My { + lateinit var s: String +} + +// TESTED_OBJECT_KIND: property +// TESTED_OBJECTS: My, s +// FLAGS: ACC_PUBLIC diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 5afafa20ba1..b395019b858 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -626,6 +626,33 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { } } + @TestMetadata("compiler/testData/writeFlags/lateinit") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Lateinit extends AbstractWriteFlagsTest { + public void testAllFilesPresentInLateinit() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeFlags/lateinit"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("lateinitGetter.kt") + public void testLateinitGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/lateinit/lateinitGetter.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitProperty.kt") + public void testLateinitProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/lateinit/lateinitProperty.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitPropertyNoSetter.kt") + public void testLateinitPropertyNoSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/lateinit/lateinitPropertyNoSetter.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/writeFlags/property") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)