From 7f8dc56d3697a0319134a11bd58819c8db4a17ec Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 13 Feb 2023 18:03:32 +0100 Subject: [PATCH] [FIR2IR] Don't generate fake overrides for clashing synthetic properties If a synthetic prop clashes with a real property (e.g. @JvmField property from parent Kotlin class), don't generate fake override for the synthetic property. This fixes a CONFLICTING_INHERITED_JVM_DECLARATIONS error in a mixed hierarchy. ^KT-56538 Fixed --- .../generators/FakeOverrideGenerator.kt | 17 ++++++---- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../syntheticPropClashingWithJvmField.kt | 33 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ 6 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index ad1cb89afda..fa89364c903 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -83,12 +83,17 @@ class FakeOverrideGenerator( // This parameter is only needed for data-class methods that is irrelevant for lazy library classes realDeclarationSymbols = emptySet() ) - FirSyntheticPropertiesScope.createIfSyntheticNamesProviderIsDefined(session, firClass.defaultType(), useSiteMemberScope)?.let { - generateFakeOverridesForName( - irClass, it, name, firClass, this, - // This parameter is only needed for data-class methods that is irrelevant for lazy library classes - realDeclarationSymbols = emptySet() - ) + // Only add synthetic properties if no real properties were found. This can happen in a mixed hierarchy when a Java class + // inherits an @JvmField property. When a Kotlin class extends that Java class, CONFLICTING_INHERITED_JVM_DECLARATIONS will be + // reported otherwise. See KT-56538. + if (none { it is IrProperty }) { + FirSyntheticPropertiesScope.createIfSyntheticNamesProviderIsDefined(session, firClass.defaultType(), useSiteMemberScope)?.let { + generateFakeOverridesForName( + irClass, it, name, firClass, this, + // This parameter is only needed for data-class methods that is irrelevant for lazy library classes + realDeclarationSymbols = emptySet() + ) + } } if (firClass.isEnumClass) return@buildList // F/O for values/valueOf/entries aren't needed, for other members aren't possible val staticScope = firClass.scopeProvider.getStaticMemberScopeForCallables(firClass, session, scopeSession) 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 7d19f82a003..156291e7870 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 @@ -28827,6 +28827,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/javaInterop/superCallOfPrintStackTrace.kt"); } + @Test + @TestMetadata("syntheticPropClashingWithJvmField.kt") + public void testSyntheticPropClashingWithJvmField() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt"); + } + @Test @TestMetadata("unresolvedJavaClassInDifferentFile.kt") public void testUnresolvedJavaClassInDifferentFile() throws Exception { diff --git a/compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt b/compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt new file mode 100644 index 00000000000..36174bbcfc0 --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt @@ -0,0 +1,33 @@ +// TARGET_BACKEND: JVM +// WITH_STDLIB +// ISSUE: KT-56538 + +// FILE: SerializableScheme.java + +public interface SerializableScheme { + String getSchemeState(); +} + +// FILE: NewInspectionProfile.kt + +abstract class NewInspectionProfile : SerializableScheme { + @JvmField + internal var schemeState: String? = "OK" + + override fun getSchemeState(): String? = schemeState +} + +// FILE: InspectionProfileImpl.java + +public class InspectionProfileImpl extends NewInspectionProfile { +} + +// FILE: InspectionProfileModifiableModel.kt + +class InspectionProfileModifiableModel : InspectionProfileImpl() + +// FILE: test.kt + +fun box(): String { + return InspectionProfileModifiableModel().schemeState.toString() +} 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 ba5c3451401..b715c97a6bb 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 @@ -27585,6 +27585,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/superCallOfPrintStackTrace.kt"); } + @Test + @TestMetadata("syntheticPropClashingWithJvmField.kt") + public void testSyntheticPropClashingWithJvmField() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt"); + } + @Test @TestMetadata("unresolvedJavaClassInDifferentFile.kt") public void testUnresolvedJavaClassInDifferentFile() throws Exception { 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 7e86d21702d..5ec4837cb89 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 @@ -28827,6 +28827,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/superCallOfPrintStackTrace.kt"); } + @Test + @TestMetadata("syntheticPropClashingWithJvmField.kt") + public void testSyntheticPropClashingWithJvmField() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt"); + } + @Test @TestMetadata("unresolvedJavaClassInDifferentFile.kt") public void testUnresolvedJavaClassInDifferentFile() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 5fa138ba5ba..7094a5fcbdc 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23283,6 +23283,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/superCallOfPrintStackTrace.kt"); } + @TestMetadata("syntheticPropClashingWithJvmField.kt") + public void testSyntheticPropClashingWithJvmField() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/syntheticPropClashingWithJvmField.kt"); + } + @TestMetadata("unresolvedJavaClassInDifferentFile.kt") public void testUnresolvedJavaClassInDifferentFile() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/unresolvedJavaClassInDifferentFile.kt");