diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/NeedSyntheticChecker.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/NeedSyntheticChecker.java index a39436bf670..a58ebf02956 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/NeedSyntheticChecker.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/NeedSyntheticChecker.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.checkers; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; +import org.jetbrains.kotlin.descriptors.PropertyDescriptor; import org.jetbrains.kotlin.descriptors.Visibilities; import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker; import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext; @@ -30,7 +31,7 @@ import static org.jetbrains.kotlin.resolve.BindingContext.NEED_SYNTHETIC_ACCESSO public class NeedSyntheticChecker implements CallChecker { @Override - public void check( + public void check( @NotNull ResolvedCall resolvedCall, @NotNull BasicCallResolutionContext context ) { @@ -45,7 +46,14 @@ public class NeedSyntheticChecker implements CallChecker { // e.g.: from class to companion object) controlled via NEED_SYNTHETIC_ACCESSOR slice private static boolean needSyntheticAccessor(LexicalScope invokationScope, CallableDescriptor targetDescriptor) { return targetDescriptor instanceof CallableMemberDescriptor && - Visibilities.isPrivate(targetDescriptor.getVisibility()) && + isPrivate(targetDescriptor) && targetDescriptor.getContainingDeclaration() != invokationScope.getOwnerDescriptor().getContainingDeclaration(); } + + private static boolean isPrivate(@NotNull CallableDescriptor targetDescriptor) { + return Visibilities.isPrivate(targetDescriptor.getVisibility()) || + (targetDescriptor instanceof PropertyDescriptor && + ((PropertyDescriptor) targetDescriptor).getSetter() != null && + Visibilities.isPrivate(((PropertyDescriptor) targetDescriptor).getSetter().getVisibility())); + } } diff --git a/compiler/testData/codegen/box/properties/kt8928.kt b/compiler/testData/codegen/box/properties/kt8928.kt new file mode 100644 index 00000000000..bafc93f62b3 --- /dev/null +++ b/compiler/testData/codegen/box/properties/kt8928.kt @@ -0,0 +1,16 @@ +class App { + fun init() { + s = "OK" + } + companion object { + var s: String = "Fail" + private set + + } +} + +fun box(): String { + App().init() + + return App.s +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 09252ce51f0..19156793f6b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -6742,6 +6742,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt8928.kt") + public void testKt8928() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/kt8928.kt"); + doTest(fileName); + } + @TestMetadata("kt9603.kt") public void testKt9603() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/kt9603.kt");