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 0c43d64966a..515b80a2c0f 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 @@ -22074,6 +22074,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/j+k/KJKInheritanceGeneric.kt"); } + @Test + @TestMetadata("kjkPropertyAndExtensionProperty.kt") + public void testKjkPropertyAndExtensionProperty() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt"); + } + @Test @TestMetadata("kt1402.kt") public void testKt1402() 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 be04bce334c..0a2c4a4d512 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 @@ -22074,6 +22074,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/j+k/KJKInheritanceGeneric.kt"); } + @Test + @TestMetadata("kjkPropertyAndExtensionProperty.kt") + public void testKjkPropertyAndExtensionProperty() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt"); + } + @Test @TestMetadata("kt1402.kt") public void testKt1402() throws Exception { 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 f1f9223ae73..f0efa1d0af4 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 @@ -22068,6 +22068,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/j+k/KJKInheritanceGeneric.kt"); } + @Test + @TestMetadata("kjkPropertyAndExtensionProperty.kt") + public void testKjkPropertyAndExtensionProperty() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt"); + } + @Test @TestMetadata("kt1402.kt") public void testKt1402() 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 9b5debc9053..8b2bfd15de3 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 @@ -22074,6 +22074,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/j+k/KJKInheritanceGeneric.kt"); } + @Test + @TestMetadata("kjkPropertyAndExtensionProperty.kt") + public void testKjkPropertyAndExtensionProperty() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt"); + } + @Test @TestMetadata("kt1402.kt") public void testKt1402() 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 05d8ca3fc76..21d28dc4331 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 @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.AbstractTypeChecker -import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.runIf /** @@ -141,8 +140,8 @@ class JavaClassUseSiteMemberScope( } /* - * From supertype we can get at most two results: - * 1. Set of properties with same name + * From supertype we can get: + * 1. Set of properties with same name (including regular and extension properties) * 2. Field from some java superclass (only one, if class have more than one superclass then we can choose * just one field because this is incorrect code anyway) */ @@ -153,23 +152,24 @@ class JavaClassUseSiteMemberScope( } assert(fieldsFromSupertype.size in 0..1) - assert(propertiesFromSupertypes.size in 0..1) fieldsFromSupertype.firstOrNull()?.chosenSymbol?.let { fieldSymbol -> require(fieldSymbol is FirFieldSymbol) if (fieldSymbol.name !in fieldNames) { - result.addIfNotNull(fieldSymbol) + result.add(fieldSymbol) } } @Suppress("UNCHECKED_CAST") - val overriddenProperty = propertiesFromSupertypes.firstOrNull() as ResultOfIntersection? ?: return result - val overrideInClass = syntheticPropertyCache.getValue(name, this to overriddenProperty) + for (overriddenProperty in propertiesFromSupertypes as List>) { + val overrideInClass = syntheticPropertyCache.getValue(name, this to overriddenProperty) + + val chosenSymbol = overrideInClass ?: overriddenProperty.chosenSymbol + directOverriddenProperties[chosenSymbol] = listOf(overriddenProperty) + overriddenProperty.overriddenMembers.forEach { overrideByBase[it.member] = overrideInClass } + result += chosenSymbol + } - val chosenSymbol = overrideInClass ?: overriddenProperty.chosenSymbol - directOverriddenProperties[chosenSymbol] = listOf(overriddenProperty) - overriddenProperty.overriddenMembers.forEach { overrideByBase[it.member] = overrideInClass } - result += chosenSymbol return result } diff --git a/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.fir.kt b/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.fir.kt new file mode 100644 index 00000000000..fdd4e5ae8c3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.fir.kt @@ -0,0 +1,70 @@ +// ISSUE: KT-65373, KT-65464 + +// FILE: J.java +public class J extends D {} + +// FILE: JOverridesRegular.java +public class JOverridesRegular extends D { + @Override + public int getA() { + return 1; + } +} + +// FILE: JOverridesExtension.java +public class JOverridesExtension extends D { + @Override + public int getA(String $this) { + return 1; + } +} + +// FILE: JOVerridesBoth.java +public class JOVerridesBoth extends D { + @Override + public int getA() { + return 1; + } + + @Override + public int getA(String $this) { + return 1; + } +} + +// FILE: 1.kt +open class D { + open val a: Int + get() = 2 + + open val String.a: Int + get() = 1 +} + +class F : J() { + fun test() { + a + "".a + } +} + +class F2 : JOverridesRegular() { + fun test() { + a + "".a + } +} + +class F3 : JOverridesExtension() { + fun test() { + a + "".a + } +} + +class F4 : JOVerridesBoth() { + fun test() { + a + "".a + } +} diff --git a/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt b/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt new file mode 100644 index 00000000000..947a47e52a3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt @@ -0,0 +1,70 @@ +// ISSUE: KT-65373, KT-65464 + +// FILE: J.java +public class J extends D {} + +// FILE: JOverridesRegular.java +public class JOverridesRegular extends D { + @Override + public int getA() { + return 1; + } +} + +// FILE: JOverridesExtension.java +public class JOverridesExtension extends D { + @Override + public int getA(String $this) { + return 1; + } +} + +// FILE: JOVerridesBoth.java +public class JOVerridesBoth extends D { + @Override + public int getA() { + return 1; + } + + @Override + public int getA(String $this) { + return 1; + } +} + +// FILE: 1.kt +open class D { + open val a: Int + get() = 2 + + open val String.a: Int + get() = 1 +} + +class F : J() { + fun test() { + a + "".a + } +} + +class F2 : JOverridesRegular() { + fun test() { + a + "".a + } +} + +class F3 : JOverridesExtension() { + fun test() { + a + "".a + } +} + +class F4 : JOVerridesBoth() { + fun test() { + a + "".a + } +} 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 708d14911fa..759dea4f20c 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 @@ -22074,6 +22074,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/KJKInheritanceGeneric.kt"); } + @Test + @TestMetadata("kjkPropertyAndExtensionProperty.kt") + public void testKjkPropertyAndExtensionProperty() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/kjkPropertyAndExtensionProperty.kt"); + } + @Test @TestMetadata("kt1402.kt") public void testKt1402() throws Exception {