From 993925f6560ba9c6918f11eac7818622f522b78a Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 10 May 2023 17:48:31 +0200 Subject: [PATCH] [FIR] Ignore private properties in accessor override check JavaClassUseSiteMemberScope won't return a Java method getFoo if there is an inherited Kotlin property foo in scope because calling this method would effectively call the property accessor which is not possible in Kotlin. This commit excludes private properties from this consideration because no accessor methods are generated for them, and so calling a Java method getFoo is ok. #KT-58577 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++ ...sticCompilerFE10TestDataTestGenerated.java | 6 +++ ...ublicJavaAndPrivateKotlinVar.overrides.txt | 3 ++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 +++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 +++ .../scopes/JavaClassUseSiteMemberScope.kt | 3 ++ .../privatePropertyAndSetterMultiModule.kt | 46 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++ 8 files changed, 82 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 9252c57aae6..4a9665993a1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -19732,6 +19732,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.kt"); } + @Test + @TestMetadata("privatePropertyAndSetterMultiModule.kt") + public void testPrivatePropertyAndSetterMultiModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt"); + } + @Test @TestMetadata("protectedStaticSamePackage.kt") public void testProtectedStaticSamePackage() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index eab37bec9d3..8fe1708beda 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -19732,6 +19732,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.kt"); } + @Test + @TestMetadata("privatePropertyAndSetterMultiModule.kt") + public void testPrivatePropertyAndSetterMultiModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt"); + } + @Test @TestMetadata("protectedStaticSamePackage.kt") public void testProtectedStaticSamePackage() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolve/scopes/publicJavaAndPrivateKotlinVar.overrides.txt b/compiler/fir/analysis-tests/testData/resolve/scopes/publicJavaAndPrivateKotlinVar.overrides.txt index 97dd656c1ce..a01532a7785 100644 --- a/compiler/fir/analysis-tests/testData/resolve/scopes/publicJavaAndPrivateKotlinVar.overrides.txt +++ b/compiler/fir/analysis-tests/testData/resolve/scopes/publicJavaAndPrivateKotlinVar.overrides.txt @@ -9,6 +9,9 @@ C: D: [Source]: public open override fun getName(): R|kotlin/String| from Java enhancement scope for /D [id: 0] [Enhancement]: public abstract fun getName(): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /B] for type C [id: 1] + [Source]: public open override fun setName(newName: R|kotlin/String|): R|kotlin/Any?| from Java enhancement scope for /D [id: 0] + [SubstitutionOverride]: public abstract fun setName(newName: R|kotlin/String!|): R|kotlin/Any!| from Substitution scope for [Java enhancement scope for /B] for type C [id: 1] + [Enhancement]: public abstract fun setName(newName: R|kotlin/String!|): R|ft| from Java enhancement scope for /B [id: 2] [Source]: private final var name: R|kotlin/String| = R|/name| from Java enhancement scope for /D [id: 0] [Source]: private final var name: R|kotlin/String| = R|/name| from Use site scope of /C [id: 0] diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 3a4b7a32353..46992b6f0a3 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -19732,6 +19732,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.kt"); } + @Test + @TestMetadata("privatePropertyAndSetterMultiModule.kt") + public void testPrivatePropertyAndSetterMultiModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt"); + } + @Test @TestMetadata("protectedStaticSamePackage.kt") public void testProtectedStaticSamePackage() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index e956c3ef7fc..9e784605098 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -19738,6 +19738,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.kt"); } + @Test + @TestMetadata("privatePropertyAndSetterMultiModule.kt") + public void testPrivatePropertyAndSetterMultiModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt"); + } + @Test @TestMetadata("protectedStaticSamePackage.kt") public void testProtectedStaticSamePackage() throws Exception { 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 37d4b4db595..2f74ed2fa46 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.java.scopes import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy @@ -549,6 +550,8 @@ class JavaClassUseSiteMemberScope( } private fun FirPropertySymbol.isOverriddenInClassBy(functionSymbol: FirNamedFunctionSymbol): Boolean { + if (rawStatus.visibility == Visibilities.Private) return false + val accessorDescriptors = when (val fir = fir) { is FirSyntheticProperty -> { if (fir.getter.delegate.symbol == functionSymbol || fir.setter?.delegate?.symbol == functionSymbol) return true diff --git a/compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt b/compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt new file mode 100644 index 00000000000..82fe0ff330e --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt @@ -0,0 +1,46 @@ +// FIR_IDENTICAL +// SKIP_TXT + +// MODULE: lib + +// FILE: JBaseInterface.java +public interface JBaseInterface { + String getData2(); + void setData2(String data); + + String getData4(); + void setData4(String data); + + String getData5(); + void setData5(String data); +} + +// FILE: KIntermediateClass.kt +open class KIntermediateClass : JBaseInterface { + private var data2: String? = "" + override fun getData2(): String = "" + override fun setData2(data: String) {} + + private var data4: String? = "" + override fun getData4(): String? = "" + override fun setData4(data: String) {} + + private var data5: String = "" + override fun getData5(): String = "" + override fun setData5(data: String?) {} +} + +// FILE: JChildClass.java +public class JChildClass extends KIntermediateClass {} + +// MODULE: main(lib) + +// FILE: Main.kt +fun main(editorTabs: JChildClass) { + editorTabs.getData2() + editorTabs.setData2("") + editorTabs.getData4() + editorTabs.setData4("") + editorTabs.getData5() + editorTabs.setData5("") +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 9af6550c9fd..b0512916469 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -19738,6 +19738,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/privateNestedClassStaticMember.kt"); } + @Test + @TestMetadata("privatePropertyAndSetterMultiModule.kt") + public void testPrivatePropertyAndSetterMultiModule() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/privatePropertyAndSetterMultiModule.kt"); + } + @Test @TestMetadata("protectedStaticSamePackage.kt") public void testProtectedStaticSamePackage() throws Exception {