K2: generate Java synthetics for Kotlin get/sets w/out type parameters
This commit is a follow-up to d8a20f19 and
provides additional K1 compatibility.
#KT-59550 Fixed
This commit is contained in:
+6
@@ -18671,6 +18671,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
|||||||
runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt");
|
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
|
@Test
|
||||||
@TestMetadata("toLong.kt")
|
@TestMetadata("toLong.kt")
|
||||||
public void testToLong() throws Exception {
|
public void testToLong() throws Exception {
|
||||||
|
|||||||
+6
@@ -18671,6 +18671,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt");
|
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
|
@Test
|
||||||
@TestMetadata("toLong.kt")
|
@TestMetadata("toLong.kt")
|
||||||
public void testToLong() throws Exception {
|
public void testToLong() throws Exception {
|
||||||
|
|||||||
+11
-2
@@ -196,7 +196,7 @@ class JavaClassUseSiteMemberScope(
|
|||||||
|
|
||||||
candidateSymbol.takeIf {
|
candidateSymbol.takeIf {
|
||||||
when {
|
when {
|
||||||
candidate.isJavaOrEnhancement ->
|
candidate.isAcceptableAsAccessorOverride() ->
|
||||||
// TODO: Decide something for the case when property type is not computed yet
|
// TODO: Decide something for the case when property type is not computed yet
|
||||||
expectedReturnType == null ||
|
expectedReturnType == null ||
|
||||||
AbstractTypeChecker.isSubtypeOf(session.typeContext, candidateReturnType, expectedReturnType)
|
AbstractTypeChecker.isSubtypeOf(session.typeContext, candidateReturnType, expectedReturnType)
|
||||||
@@ -220,11 +220,20 @@ class JavaClassUseSiteMemberScope(
|
|||||||
candidate.valueParameters.single().returnTypeRef.toConeKotlinTypeProbablyFlexible(session, typeParameterStack)
|
candidate.valueParameters.single().returnTypeRef.toConeKotlinTypeProbablyFlexible(session, typeParameterStack)
|
||||||
|
|
||||||
candidateSymbol.takeIf {
|
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? {
|
private fun FirPropertySymbol.getBuiltinSpecialPropertyGetterName(): Name? {
|
||||||
var result: Name? = null
|
var result: Name? = null
|
||||||
superTypeScopes.processOverriddenPropertiesAndSelf(this) { overridden ->
|
superTypeScopes.processOverriddenPropertiesAndSelf(this) { overridden ->
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// IGNORE_BACKEND_K2: JVM_IR
|
|
||||||
// ISSUE: KT-59550
|
// ISSUE: KT-59550
|
||||||
|
|
||||||
// FILE: Intermediate.java
|
// FILE: Intermediate.java
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
+6
@@ -18671,6 +18671,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt");
|
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
|
@Test
|
||||||
@TestMetadata("toLong.kt")
|
@TestMetadata("toLong.kt")
|
||||||
public void testToLong() throws Exception {
|
public void testToLong() throws Exception {
|
||||||
|
|||||||
+6
@@ -18671,6 +18671,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
|||||||
runTest("compiler/testData/codegen/box/fir/syntheticPropertyThroughJavaMultiModule.kt");
|
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
|
@Test
|
||||||
@TestMetadata("toLong.kt")
|
@TestMetadata("toLong.kt")
|
||||||
public void testToLong() throws Exception {
|
public void testToLong() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user