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 db9edeb3802..f963b8da042 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 @@ -3279,6 +3279,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/callableReference/publicMutableField.kt"); } + @Test + @TestMetadata("referenceToGenericSyntheticProperty.kt") + public void testReferenceToGenericSyntheticProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt"); + } + @Test @TestMetadata("staticMethod.kt") public void testStaticMethod() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxModernJdkCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxModernJdkCodegenTestGenerated.java index 4bbdc26d773..942c3e0cac0 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxModernJdkCodegenTestGenerated.java @@ -352,6 +352,12 @@ public class FirLightTreeBlackBoxModernJdkCodegenTestGenerated extends AbstractF runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/bytecodeShapeForJava.kt"); } + @Test + @TestMetadata("callableReferenceToGenericRecord.kt") + public void testCallableReferenceToGenericRecord() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt"); + } + @Test @TestMetadata("collectionSizeOverrides.kt") public void testCollectionSizeOverrides() 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 0f8df87aae0..302f63fc700 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 @@ -3279,6 +3279,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/callableReference/publicMutableField.kt"); } + @Test + @TestMetadata("referenceToGenericSyntheticProperty.kt") + public void testReferenceToGenericSyntheticProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt"); + } + @Test @TestMetadata("staticMethod.kt") public void testStaticMethod() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxModernJdkCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxModernJdkCodegenTestGenerated.java index 7c3dd9f2943..4ac0e988b49 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxModernJdkCodegenTestGenerated.java @@ -352,6 +352,12 @@ public class FirPsiBlackBoxModernJdkCodegenTestGenerated extends AbstractFirPsiB runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/bytecodeShapeForJava.kt"); } + @Test + @TestMetadata("callableReferenceToGenericRecord.kt") + public void testCallableReferenceToGenericRecord() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt"); + } + @Test @TestMetadata("collectionSizeOverrides.kt") public void testCollectionSizeOverrides() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index 024433972df..245c7a1a46b 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.scopes.* @@ -124,20 +125,13 @@ class FirSyntheticPropertiesScope private constructor( }) } - val classLookupTag = getterSymbol.originalOrSelf().dispatchReceiverClassLookupTagOrNull() - val packageName = classLookupTag?.classId?.packageFqName ?: getterSymbol.callableId.packageName - val className = classLookupTag?.classId?.relativeClassName - - val property = buildSyntheticProperty { - moduleData = session.moduleData - name = propertyName - symbol = FirSimpleSyntheticPropertySymbol( - getterId = getterSymbol.callableId, - propertyId = CallableId(packageName, className, propertyName) + val property = buildSyntheticProperty(propertyName, getter, matchingSetter) + getter.originalForSubstitutionOverride?.let { + property.originalForSubstitutionOverrideAttr = buildSyntheticProperty( + propertyName, + it, + matchingSetter?.originalForSubstitutionOverride ) - delegateGetter = getter - delegateSetter = matchingSetter - deprecationsProvider = getDeprecationsProviderFromAccessors(session, getter, matchingSetter) } val syntheticSymbol = property.symbol (baseScope as? FirUnstableSmartcastTypeScope)?.apply { @@ -148,6 +142,24 @@ class FirSyntheticPropertiesScope private constructor( processor(syntheticSymbol) } + private fun buildSyntheticProperty(propertyName: Name, getter: FirSimpleFunction, setter: FirSimpleFunction?): FirSyntheticProperty { + val classLookupTag = getter.symbol.originalOrSelf().dispatchReceiverClassLookupTagOrNull() + val packageName = classLookupTag?.classId?.packageFqName ?: getter.symbol.callableId.packageName + val className = classLookupTag?.classId?.relativeClassName + + return buildSyntheticProperty { + moduleData = session.moduleData + name = propertyName + symbol = FirSimpleSyntheticPropertySymbol( + getterId = getter.symbol.callableId, + propertyId = CallableId(packageName, className, propertyName) + ) + delegateGetter = getter + delegateSetter = setter + deprecationsProvider = getDeprecationsProviderFromAccessors(session, getter, setter) + } + } + private fun setterTypeIsConsistentWithGetterType( getterSymbol: FirNamedFunctionSymbol, parameterType: ConeKotlinType, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 5b33f85ec86..3f33b9c7166 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isLocal +import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType @@ -63,7 +64,7 @@ val FirCallableSymbol<*>.isSubstitutionOverride: Boolean get() = origin == FirDe val FirCallableSymbol<*>.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride inline val D.originalForSubstitutionOverride: D? - get() = if (isSubstitutionOverride) originalForSubstitutionOverrideAttr else null + get() = if (isSubstitutionOverride || isSynthetic) originalForSubstitutionOverrideAttr else null inline val > S.originalForSubstitutionOverride: S? get() = fir.originalForSubstitutionOverride?.symbol as S? diff --git a/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt b/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt new file mode 100644 index 00000000000..d5c9091eaee --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_K1: JVM_IR +// K1_STATUS: Broken because of KT-57103 + +// FILE: J.java + +public class J { + private final T value; + public J(T value) { + this.value = value; + } + public T getValue() { + return value; + } +} + + +// FILE: test.kt + +fun box(): String { + val j = J("OK") + if (j.value != "OK") return "FAIL" + if (run(j::value) != "OK") return "FAIL" + if (j.let(J::value) != "OK") return "FAIL" + + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt b/compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt index 2917dace3d6..719f58f5ea5 100644 --- a/compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt +++ b/compiler/testData/codegen/box/delegatedProperty/delegateToAnother/genericJavaProperty.kt @@ -1,5 +1,5 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_K2: JVM_IR, JS_IR +// IGNORE_BACKEND_K2: JS_IR // WITH_REFLECT // WITH_STDLIB // FILE: J.java diff --git a/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt b/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt new file mode 100644 index 00000000000..4cb48fb7d48 --- /dev/null +++ b/compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt @@ -0,0 +1,16 @@ +// ENABLE_JVM_PREVIEW + +// FILE: R.java + +public record R(T value) {} + +// FILE: test.kt + +fun box(): String { + val r = R("OK") + if (r.value != "OK") return "FAIL" + if (run(r::value) != "OK") return "FAIL" + if (r.let(R::value) != "OK") return "FAIL" + + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 33769e42b8b..6753f3e2e0f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -3135,6 +3135,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/publicMutableField.kt"); } + @Test + @TestMetadata("referenceToGenericSyntheticProperty.kt") + public void testReferenceToGenericSyntheticProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt"); + } + @Test @TestMetadata("staticMethod.kt") public void testStaticMethod() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxModernJdkCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxModernJdkCodegenTestGenerated.java index de5ba730df6..5f668260911 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxModernJdkCodegenTestGenerated.java @@ -328,6 +328,12 @@ public class BlackBoxModernJdkCodegenTestGenerated extends AbstractBlackBoxCodeg runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/bytecodeShapeForJava.kt"); } + @Test + @TestMetadata("callableReferenceToGenericRecord.kt") + public void testCallableReferenceToGenericRecord() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt"); + } + @Test @TestMetadata("collectionSizeOverrides.kt") public void testCollectionSizeOverrides() throws Exception { 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 4b470431f4d..0b67d2148b9 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 @@ -3279,6 +3279,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/publicMutableField.kt"); } + @Test + @TestMetadata("referenceToGenericSyntheticProperty.kt") + public void testReferenceToGenericSyntheticProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt"); + } + @Test @TestMetadata("staticMethod.kt") public void testStaticMethod() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java index e1a96081b7b..505417f1841 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxModernJdkCodegenTestGenerated.java @@ -352,6 +352,12 @@ public class IrBlackBoxModernJdkCodegenTestGenerated extends AbstractIrBlackBoxC runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/bytecodeShapeForJava.kt"); } + @Test + @TestMetadata("callableReferenceToGenericRecord.kt") + public void testCallableReferenceToGenericRecord() throws Exception { + runTest("compiler/testData/codegen/boxModernJdk/testsWithJava17/records/callableReferenceToGenericRecord.kt"); + } + @Test @TestMetadata("collectionSizeOverrides.kt") public void testCollectionSizeOverrides() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 633586f0650..52aafb0ede3 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2743,6 +2743,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/publicMutableField.kt"); } + @TestMetadata("referenceToGenericSyntheticProperty.kt") + public void testReferenceToGenericSyntheticProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt"); + } + @TestMetadata("staticMethod.kt") public void testStaticMethod() throws Exception { runTest("compiler/testData/codegen/box/callableReference/staticMethod.kt");