From 9394caf9cfec6f6b0ac1c835c43a91cb8332b410 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 23 Oct 2018 16:11:09 +0200 Subject: [PATCH] Use access to backing field on overridden property with private setter #KT-27772 Fixed --- .../kotlin/codegen/JvmCodegenUtil.java | 2 +- .../privateAccessorOfOverriddenProperty.kt | 18 ++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 3826c72f3f1..3b1a4fef03e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -244,7 +244,7 @@ public class JvmCodegenUtil { if (DescriptorPsiUtilsKt.hasBody(accessor)) return false; // If the accessor is private or final, it can't be overridden in the subclass and thus we can use direct access - return Visibilities.isPrivate(property.getVisibility()) || accessor.getModality() == FINAL; + return Visibilities.isPrivate(accessor.getVisibility()) || accessor.getModality() == FINAL; } private static boolean isDebuggerContext(@NotNull CodegenContext context) { diff --git a/compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt b/compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt new file mode 100644 index 00000000000..28762ed8d2b --- /dev/null +++ b/compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt @@ -0,0 +1,18 @@ +interface A { + val foo: String +} + +class B : A { + override var foo: String = "Fail" + private set + + fun setOK(other: B) { + other.foo = "OK" + } +} + +fun box(): String { + val b = B() + b.setOK(b) + return b.foo +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 505ac0e943f..5d2f3a138b5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -17530,6 +17530,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDelegateAccessor.kt"); } + @TestMetadata("privateAccessorOfOverriddenProperty.kt") + public void testPrivateAccessorOfOverriddenProperty() throws Exception { + runTest("compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt"); + } + @TestMetadata("privatePropertyInConstructor.kt") public void testPrivatePropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/properties/privatePropertyInConstructor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 942fba00c3f..2c4beb9aa78 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17530,6 +17530,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/properties/primitiveOverrideDelegateAccessor.kt"); } + @TestMetadata("privateAccessorOfOverriddenProperty.kt") + public void testPrivateAccessorOfOverriddenProperty() throws Exception { + runTest("compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt"); + } + @TestMetadata("privatePropertyInConstructor.kt") public void testPrivatePropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/properties/privatePropertyInConstructor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 7ea1bd549a3..5134c7cbfd8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -17535,6 +17535,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/properties/primitiveOverrideDelegateAccessor.kt"); } + @TestMetadata("privateAccessorOfOverriddenProperty.kt") + public void testPrivateAccessorOfOverriddenProperty() throws Exception { + runTest("compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt"); + } + @TestMetadata("privatePropertyInConstructor.kt") public void testPrivatePropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/properties/privatePropertyInConstructor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 40cb00f04c6..c6f44e0b03d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -15105,6 +15105,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDelegateAccessor.kt"); } + @TestMetadata("privateAccessorOfOverriddenProperty.kt") + public void testPrivateAccessorOfOverriddenProperty() throws Exception { + runTest("compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt"); + } + @TestMetadata("privatePropertyInConstructor.kt") public void testPrivatePropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/properties/privatePropertyInConstructor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 1e3fc1918d0..f23704e4a6c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -16150,6 +16150,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDelegateAccessor.kt"); } + @TestMetadata("privateAccessorOfOverriddenProperty.kt") + public void testPrivateAccessorOfOverriddenProperty() throws Exception { + runTest("compiler/testData/codegen/box/properties/privateAccessorOfOverriddenProperty.kt"); + } + @TestMetadata("privatePropertyInConstructor.kt") public void testPrivatePropertyInConstructor() throws Exception { runTest("compiler/testData/codegen/box/properties/privatePropertyInConstructor.kt");