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:
+6
@@ -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
|
||||
|
||||
+1
-1
@@ -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()}")
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -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()
|
||||
+6
@@ -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
|
||||
|
||||
+6
@@ -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
|
||||
|
||||
+5
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user