IR: get overridden directly from IrProperty when resolving fake override

The previous way of getting them either via getter or setter failed on
Java properties which only have a backing field. Now that IrProperty has
overriddenSymbols (after 53c1de172f), it makes sense to use it directly
instead. Use it only in SyntheticAccessorLowering though to avoid
breaking Kotlin/Native (see KT-47019).

 #KT-46900 Fixed
This commit is contained in:
Alexander Udalov
2021-05-27 17:35:36 +02:00
parent af35892007
commit 96f0b53761
8 changed files with 53 additions and 5 deletions
@@ -40630,6 +40630,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
public void testKt46578_propertyRef() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
}
@Test
@TestMetadata("kt46900_jkk_inheritance.kt")
public void testKt46900_jkk_inheritance() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt");
}
}
@Nested
@@ -776,7 +776,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
return this.overriddenSymbols
.map { it.owner }
.collectAndFilterRealOverrides()
.collectAndFilterRealOverrides(getOverriddenPropertySymbols = IrProperty::overriddenSymbols)
.firstOrNull() as? IrProperty
?: throw AssertionError("No real override for ${this.render()}")
}
@@ -153,6 +153,7 @@ class IrOverridingUtil(
.flatMap {
when (it) {
is IrSimpleFunction -> it.overriddenSymbols.map { it.owner }
// TODO: use IrProperty.overriddenSymbols instead: KT-47019
is IrProperty -> (it.getter ?: it.setter)?.overriddenSymbols
?.map { it.owner.correspondingPropertySymbol!!.owner }
?: emptyList()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
val IrDeclaration.isReal: Boolean get() = !isFakeOverride
@@ -50,7 +51,12 @@ fun IrSimpleFunction.collectRealOverrides(
fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
toSkip: (IrOverridableMember) -> Boolean = { false },
filter: (IrOverridableMember) -> Boolean = { false }
filter: (IrOverridableMember) -> Boolean = { false },
getOverriddenPropertySymbols: IrProperty.() -> List<IrPropertySymbol> = {
// TODO: use IrProperty.overriddenSymbols instead: KT-47019
// (at the moment it breaks K/N in at least :kotlin-native:backend.native:tests:coroutines_functionReference_eqeq_name)
(getter ?: setter)?.overriddenSymbols?.mapNotNull { it.owner.correspondingPropertySymbol }.orEmpty()
},
): Set<IrOverridableMember> {
val visited = mutableSetOf<IrOverridableMember>()
@@ -63,9 +69,7 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols
is IrProperty -> (declaration.getter ?: declaration.setter)
?.overriddenSymbols?.mapNotNull { it.owner.correspondingPropertySymbol }
?: emptyList()
is IrProperty -> declaration.getOverriddenPropertySymbols()
else -> error("Unexpected overridable member: ${declaration.render()}")
}
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// FILE: Base.java
import org.jetbrains.annotations.NotNull;
public abstract class Base {
@NotNull
protected String result = "OK";
}
// FILE: Derived.kt
open class Mid : Base()
class Derived : Mid() {
fun foo(): String =
(Derived::result)(this)
}
fun box(): String = Derived().foo()
@@ -40600,6 +40600,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
public void testKt46578_propertyRef() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
}
@Test
@TestMetadata("kt46900_jkk_inheritance.kt")
public void testKt46900_jkk_inheritance() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt");
}
}
@Nested
@@ -40630,6 +40630,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
public void testKt46578_propertyRef() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
}
@Test
@TestMetadata("kt46900_jkk_inheritance.kt")
public void testKt46900_jkk_inheritance() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt");
}
}
@Nested
@@ -32581,6 +32581,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
public void testKt46578_propertyRef() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
}
@TestMetadata("kt46900_jkk_inheritance.kt")
public void testKt46900_jkk_inheritance() throws Exception {
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor")