diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 6fe5fc177d0..69330b2221f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -18671,6 +18671,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt"); } + @Test + @TestMetadata("syntheticPropertyThroughJavaWithSetter.kt") + public void testSyntheticPropertyThroughJavaWithSetter() throws Exception { + runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt"); + } + @Test @TestMetadata("toLong.kt") public void testToLong() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 45047f16b39..2f0700752a4 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -18671,6 +18671,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt"); } + @Test + @TestMetadata("syntheticPropertyThroughJavaWithSetter.kt") + public void testSyntheticPropertyThroughJavaWithSetter() throws Exception { + runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt"); + } + @Test @TestMetadata("toLong.kt") public void testToLong() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index f2e3c508a66..0584244441c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -196,7 +196,7 @@ class JavaClassUseSiteMemberScope( candidateSymbol.takeIf { when { - candidate.isJavaOrEnhancement -> + candidate.isAcceptableAsAccessorOverride() -> // TODO: Decide something for the case when property type is not computed yet expectedReturnType == null || AbstractTypeChecker.isSubtypeOf(session.typeContext, candidateReturnType, expectedReturnType) @@ -220,11 +220,20 @@ class JavaClassUseSiteMemberScope( candidate.valueParameters.single().returnTypeRef.toConeKotlinTypeProbablyFlexible(session, typeParameterStack) candidateSymbol.takeIf { - candidate.isJavaOrEnhancement && AbstractTypeChecker.equalTypes(session.typeContext, parameterType, propertyType) + candidate.isAcceptableAsAccessorOverride() && AbstractTypeChecker.equalTypes( + session.typeContext, parameterType, propertyType + ) } } } + private fun FirSimpleFunction.isAcceptableAsAccessorOverride(): Boolean { + // We don't accept here accessors with type parameters from Kotlin to avoid strange cases like KT-59038 + // However, we (temporarily, see below) accept accessors from Kotlin in general to keep K1 compatibility in cases like KT-59550 + // KT-59601: we are going to forbid accessors from Kotlin in general after some investigation and/or deprecation period + return isJavaOrEnhancement || typeParameters.isEmpty() + } + private fun FirPropertySymbol.getBuiltinSpecialPropertyGetterName(): Name? { var result: Name? = null superTypeScopes.processOverriddenPropertiesAndSelf(this) { overridden -> diff --git a/compiler/testData/codegen/box/fir/syntheticPropertyThroughJava.kt b/compiler/testData/codegen/box/fir/syntheticPropertyThroughJava.kt index 6bf489e4758..17b129ceb85 100644 --- a/compiler/testData/codegen/box/fir/syntheticPropertyThroughJava.kt +++ b/compiler/testData/codegen/box/fir/syntheticPropertyThroughJava.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM_IR -// IGNORE_BACKEND_K2: JVM_IR // ISSUE: KT-59550 // FILE: Intermediate.java diff --git a/compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt b/compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt new file mode 100644 index 00000000000..4e6e0b0bc0d --- /dev/null +++ b/compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt @@ -0,0 +1,26 @@ +// TARGET_BACKEND: JVM_IR +// ISSUE: KT-59550 + +// FILE: Intermediate.java +public class Intermediate extends Base { + public Intermediate(String foo) { + super(foo); + } +} + +// FILE: FinalAndBase.kt +abstract class Base(private var foo: String) { + fun getFoo() = foo + + fun setFoo(newFoo: String) { + foo = newFoo + } +} + +class Final(val i: Intermediate) : Intermediate(i.foo) + +fun box(): String { + val f = Final(Intermediate("")) + f.foo = "OK" + return f.foo +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 92188d857f0..f8a1d95f0c3 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18671,6 +18671,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt"); } + @Test + @TestMetadata("syntheticPropertyThroughJavaWithSetter.kt") + public void testSyntheticPropertyThroughJavaWithSetter() throws Exception { + runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt"); + } + @Test @TestMetadata("toLong.kt") public void testToLong() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 1ba803ac766..b4656320aef 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -18671,6 +18671,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt"); } + @Test + @TestMetadata("syntheticPropertyThroughJavaWithSetter.kt") + public void testSyntheticPropertyThroughJavaWithSetter() throws Exception { + runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaWithSetter.kt"); + } + @Test @TestMetadata("toLong.kt") public void testToLong() throws Exception {