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 {
|
public void testKt46578_propertyRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
|
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
|
@Nested
|
||||||
|
|||||||
+1
-1
@@ -776,7 +776,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
|
|||||||
|
|
||||||
return this.overriddenSymbols
|
return this.overriddenSymbols
|
||||||
.map { it.owner }
|
.map { it.owner }
|
||||||
.collectAndFilterRealOverrides()
|
.collectAndFilterRealOverrides(getOverriddenPropertySymbols = IrProperty::overriddenSymbols)
|
||||||
.firstOrNull() as? IrProperty
|
.firstOrNull() as? IrProperty
|
||||||
?: throw AssertionError("No real override for ${this.render()}")
|
?: throw AssertionError("No real override for ${this.render()}")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ class IrOverridingUtil(
|
|||||||
.flatMap {
|
.flatMap {
|
||||||
when (it) {
|
when (it) {
|
||||||
is IrSimpleFunction -> it.overriddenSymbols.map { it.owner }
|
is IrSimpleFunction -> it.overriddenSymbols.map { it.owner }
|
||||||
|
// TODO: use IrProperty.overriddenSymbols instead: KT-47019
|
||||||
is IrProperty -> (it.getter ?: it.setter)?.overriddenSymbols
|
is IrProperty -> (it.getter ?: it.setter)?.overriddenSymbols
|
||||||
?.map { it.owner.correspondingPropertySymbol!!.owner }
|
?.map { it.owner.correspondingPropertySymbol!!.owner }
|
||||||
?: emptyList()
|
?: emptyList()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.util
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
val IrDeclaration.isReal: Boolean get() = !isFakeOverride
|
val IrDeclaration.isReal: Boolean get() = !isFakeOverride
|
||||||
@@ -50,7 +51,12 @@ fun IrSimpleFunction.collectRealOverrides(
|
|||||||
|
|
||||||
fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
|
fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
|
||||||
toSkip: (IrOverridableMember) -> Boolean = { false },
|
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> {
|
): Set<IrOverridableMember> {
|
||||||
|
|
||||||
val visited = mutableSetOf<IrOverridableMember>()
|
val visited = mutableSetOf<IrOverridableMember>()
|
||||||
@@ -63,9 +69,7 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
|
|||||||
|
|
||||||
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
|
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
|
||||||
is IrSimpleFunction -> declaration.overriddenSymbols
|
is IrSimpleFunction -> declaration.overriddenSymbols
|
||||||
is IrProperty -> (declaration.getter ?: declaration.setter)
|
is IrProperty -> declaration.getOverriddenPropertySymbols()
|
||||||
?.overriddenSymbols?.mapNotNull { it.owner.correspondingPropertySymbol }
|
|
||||||
?: emptyList()
|
|
||||||
else -> error("Unexpected overridable member: ${declaration.render()}")
|
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 {
|
public void testKt46578_propertyRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
|
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
|
@Nested
|
||||||
|
|||||||
+6
@@ -40630,6 +40630,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
public void testKt46578_propertyRef() throws Exception {
|
public void testKt46578_propertyRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
|
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
|
@Nested
|
||||||
|
|||||||
+5
@@ -32581,6 +32581,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
public void testKt46578_propertyRef() throws Exception {
|
public void testKt46578_propertyRef() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46578_propertyRef.kt");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/syntheticAccessors/protectedMemberReferenceAccessor")
|
||||||
|
|||||||
Reference in New Issue
Block a user