diff --git a/compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt b/compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt new file mode 100644 index 00000000000..632b3d49dc5 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt @@ -0,0 +1,31 @@ +class A { + var value: String = "fail1" + private set + + inner class B { + fun foo(): kotlin.reflect.KMutableProperty0 = this@A::value + } +} + +class C { + var value: String = "fail2" + private set + + fun bar(): kotlin.reflect.KMutableProperty0 { + class D { + fun foo(): kotlin.reflect.KMutableProperty0 = this@C::value + } + + return D().foo() + } +} + +fun box(): String { + val a = A() + a.B().foo().set("O") + + val c = C() + c.bar().set("K") + + return a.value + c.value +} \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/callableReference/property/privateSetOuterClass.txt b/compiler/testData/codegen/light-analysis/callableReference/property/privateSetOuterClass.txt new file mode 100644 index 00000000000..8c3e599de8e --- /dev/null +++ b/compiler/testData/codegen/light-analysis/callableReference/property/privateSetOuterClass.txt @@ -0,0 +1,30 @@ +@kotlin.Metadata +public final class A { + private @org.jetbrains.annotations.NotNull field value: java.lang.String + inner class A/B + public method (): void + public final @org.jetbrains.annotations.NotNull method getValue(): java.lang.String + private final method setValue(p0: java.lang.String): void +} + +@kotlin.Metadata +public final class A/B { + synthetic final field this$0: A + inner class A/B + public method (p0: A): void + public final @org.jetbrains.annotations.NotNull method foo(): kotlin.reflect.KMutableProperty0 +} + +@kotlin.Metadata +public final class C { + private @org.jetbrains.annotations.NotNull field value: java.lang.String + public method (): void + public final @org.jetbrains.annotations.NotNull method bar(): kotlin.reflect.KMutableProperty0 + public final @org.jetbrains.annotations.NotNull method getValue(): java.lang.String + private final method setValue(p0: java.lang.String): void +} + +@kotlin.Metadata +public final class PrivateSetOuterClassKt { + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9b9cf0175e9..e1992d276a4 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -2176,6 +2176,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("privateSetOuterClass.kt") + public void testPrivateSetOuterClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt"); + doTest(fileName); + } + @TestMetadata("privateSetterInsideClass.kt") public void testPrivateSetterInsideClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetterInsideClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 658fc631d34..6cdb9c393fa 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -2176,6 +2176,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("privateSetOuterClass.kt") + public void testPrivateSetOuterClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt"); + doTest(fileName); + } + @TestMetadata("privateSetterInsideClass.kt") public void testPrivateSetterInsideClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetterInsideClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeCodegenTestGenerated.java index 068ad608fc0..b64605ff21c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeCodegenTestGenerated.java @@ -2176,6 +2176,12 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis doTest(fileName); } + @TestMetadata("privateSetOuterClass.kt") + public void testPrivateSetOuterClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt"); + doTest(fileName); + } + @TestMetadata("privateSetterInsideClass.kt") public void testPrivateSetterInsideClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetterInsideClass.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 108a72580e2..1a0ad261d92 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 @@ -2561,6 +2561,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("privateSetOuterClass.kt") + public void testPrivateSetOuterClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetOuterClass.kt"); + doTest(fileName); + } + @TestMetadata("privateSetterInsideClass.kt") public void testPrivateSetterInsideClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/callableReference/property/privateSetterInsideClass.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index 13ee4e4fed4..c19cca5d997 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -142,7 +142,10 @@ object CallableReferenceTranslator { val setter = descriptor.setter ?: return false if (setter.visibility != Visibilities.PRIVATE) return true val classDescriptor = context.classDescriptor ?: return false - return classDescriptor == descriptor.containingDeclaration + + val outerClasses = generateSequence(classDescriptor) { it.containingDeclaration } + .filterIsInstance() + return descriptor.containingDeclaration in outerClasses } private fun translateForPropertyAccessor(