From 6a94a3331fa6732486e4de9b5976147d2995fc69 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 26 Feb 2024 13:09:21 +0200 Subject: [PATCH] [FIR] Don't create synthetic property if getter and property came from the same class Usually we create synthetic property in java class if there is a property from the base kotlin class and getter/setter with a corresponding name in the declared scope or one of supertype scopes. But there is a case, where the same supertype contains both property and getter: ``` // FILE: Base.kt open class Base { open val b = "O" @JvmName("getBJava") fun getB() : String = "K" } // FILE: Derived.java public class Derived extends Base {} ``` In this case we shouldn't create synthetic property, because `getB()` function is invisible for `Derived` class ^KT-66020 Fixed --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../scopes/JavaClassUseSiteMemberScope.kt | 7 ++--- ...ctingGetterAndPropertyInBaseKotlinClass.kt | 26 +++++++++++++++++++ .../JvmAbiConsistencyTestBoxGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ ...xCodegenTestWithInlineScopesGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 12 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index c3bf8d24def..c2f3fe166e1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -35668,6 +35668,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index 6506352adf6..49da0ed21b9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -35668,6 +35668,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index c855920d15a..1d05283f7e3 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -35519,6 +35519,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 7f210c5662a..ed76ed632ed 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -35519,6 +35519,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 06625a6b9c3..a91112d293c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -35519,6 +35519,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 5a540d7ff08..46945b91c7d 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -175,12 +175,13 @@ class JavaClassUseSiteMemberScope( } internal fun syntheticPropertyFromOverride(overriddenProperty: ResultOfIntersection): FirSyntheticPropertySymbol? { - val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull { (symbol, _) -> + val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull superMember@{ (symbol, baseScope) -> // We may call this function at the STATUS phase, which means that using resolved status may lead to cycle // So we need to use raw status here - if (!symbol.isVisibleInClass(klass.symbol, symbol.rawStatus)) return@firstNotNullOfOrNull null + if (!symbol.isVisibleInClass(klass.symbol, symbol.rawStatus)) return@superMember null symbol.createOverridePropertyIfExists(declaredMemberScope, takeModalityFromGetter = true) - ?: superTypeScopes.firstNotNullOfOrNull { scope -> + ?: superTypeScopes.firstNotNullOfOrNull superScope@{ scope -> + if (scope == baseScope) return@superScope null symbol.createOverridePropertyIfExists(scope, takeModalityFromGetter = false) } } diff --git a/compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt b/compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt new file mode 100644 index 00000000000..939b080097f --- /dev/null +++ b/compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt @@ -0,0 +1,26 @@ +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB +// ISSUE: KT-66020 + +// FILE: Base.kt +open class Base { + open val b = "O" + + @JvmName("getBJava") + fun getB() : String = "K" +} + +// FILE: Derived.java +public class Derived extends Base { + public static String box() { + Impl x = new Impl(); + return x.getB() + x.getBJava(); + } +} + +// FILE: Impl.kt +class Impl : Derived() + +fun box(): String { + return Derived.box() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index ddb31c54284..e44ad573513 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -35519,6 +35519,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { 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 964f61f4e27..bf1009b7d56 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 @@ -35519,6 +35519,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index cd5ea962a95..698b761b151 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -35519,6 +35519,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java index 0f6a7e8e9b9..e368594da7b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java @@ -35519,6 +35519,12 @@ public class FirBlackBoxCodegenTestWithInlineScopesGenerated extends AbstractFir runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @Test + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @Test @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index acd8c0bd8ba..1ea213a8946 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -30217,6 +30217,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvmName/classMembers.kt"); } + @TestMetadata("conflictingGetterAndPropertyInBaseKotlinClass.kt") + public void testConflictingGetterAndPropertyInBaseKotlinClass() { + runTest("compiler/testData/codegen/box/jvmName/conflictingGetterAndPropertyInBaseKotlinClass.kt"); + } + @TestMetadata("fakeJvmNameInJava.kt") public void testFakeJvmNameInJava() { runTest("compiler/testData/codegen/box/jvmName/fakeJvmNameInJava.kt");