From 96f0b53761e684c086a20b4b4e97dc0c3366744d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 27 May 2021 17:35:36 +0200 Subject: [PATCH] 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 --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../jvm/lower/SyntheticAccessorLowering.kt | 2 +- .../kotlin/ir/overrides/IrOverridingUtil.kt | 1 + .../kotlin/ir/util/IrFakeOverrideUtils.kt | 12 +++++++---- .../kt46900_jkk_inheritance.kt | 20 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ 8 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 778ffccfc1c..5df7260822f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -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 diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 6b5d7f027c1..6aa85de7338 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -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()}") } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index 398ed1f50c5..10d2ee41257 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -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() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index 5e91527efff..08ff88b5357 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -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.collectAndFilterRealOverrides( toSkip: (IrOverridableMember) -> Boolean = { false }, - filter: (IrOverridableMember) -> Boolean = { false } + filter: (IrOverridableMember) -> Boolean = { false }, + getOverriddenPropertySymbols: IrProperty.() -> List = { + // 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 { val visited = mutableSetOf() @@ -63,9 +69,7 @@ fun Collection.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()}") } diff --git a/compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt b/compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt new file mode 100644 index 00000000000..a465271f040 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/protectedJavaFieldAccessor/kt46900_jkk_inheritance.kt @@ -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() 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 8968571aa12..218f61b9359 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 @@ -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 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 9ff7c3ed7db..07a491e2ed6 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 @@ -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 diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 5f448869445..02d48518766 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -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")