From bf96abeed10e511490f4801cde833dd8aee30af1 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 21 Apr 2022 11:43:46 +0300 Subject: [PATCH] FIR: Fix special members came from superclass class JavaSuperClass { // members impls with special signature, but it doesn't override any Kotlin specials } class KotlinInterface { // special members } class JavaSubClass extends JavaSuperClass implements KotlinInterface { // we should obtain members from JavaSuperClass with their Kotlinish // signature, not the Java one } --- .../specialFunctionInJava_2.overrides.txt | 37 +++++++------------ .../scopes/JavaClassUseSiteMemberScope.kt | 4 +- ...avaImplementationFromDifferentClass.fir.kt | 14 +++---- 3 files changed, 24 insertions(+), 31 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt b/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt index 02ba2867527..d6fe7a7a09c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt +++ b/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt @@ -1,33 +1,24 @@ SomeMap: - [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] - [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] + [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] [SubstitutionOverride]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 2] [Library]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] [Library]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] - [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] - [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyMap [id: 5] - [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyBaseMap] for type MyMap [id: 6] - [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyBaseMap [id: 7] - [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyBaseMap] for type MyMap [id: 6] - [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyBaseMap [id: 7] - [IntersectionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] - [SubstitutionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] - [SubstitutionOverride]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 2] - [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] - [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] - [SubstitutionOverride]: public abstract fun containsValue(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] - [Enhancement]: public abstract fun containsValue(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyMap [id: 5] - [IntersectionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Java enhancement scope for /SomeMap [id: 0] - [SubstitutionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] + [SubstitutionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 1] + [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 2] + [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 2] + [IntersectionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] [SubstitutionOverride]: public abstract operator fun get(key: R|K|): R|V?| from Use site scope of kotlin/collections/MutableMap [id: 2] [Library]: public abstract operator fun get(key: R|K|): R|V?| from Use site scope of kotlin/collections/Map [id: 3] [Library]: public abstract operator fun get(key: R|K|): R|V?| from Use site scope of kotlin/collections/Map [id: 3] - [SubstitutionOverride]: public abstract operator fun get(key: R|ft|): R|ft| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] - [Enhancement]: public abstract operator fun get(key: R|ft|): R|ft| from Java enhancement scope for /MyMap [id: 5] - [Enhancement]: public abstract fun remove(key: R|ft|): R|V3?| from Java enhancement scope for /SomeMap [id: 0] - [SubstitutionOverride]: public abstract fun remove(key: R|ft|): R|V3?| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] + [SubstitutionOverride]: public abstract operator fun get(key: R|ft|): R|ft| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] + [Enhancement]: public abstract operator fun get(key: R|ft|): R|ft| from Java enhancement scope for /MyMap [id: 5] + [Enhancement]: public abstract fun remove(key: R|ft|): R|V3?| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public abstract fun remove(key: R|ft|): R|V3?| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] [Library]: public abstract fun remove(key: R|K|): R|V?| from Use site scope of kotlin/collections/MutableMap [id: 2] - [SubstitutionOverride]: public open fun remove(key: R|ft|, value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public open fun remove(key: R|ft|, value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] [Library]: public open fun remove(key: R|K|, value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 1] MyMap: @@ -35,5 +26,5 @@ MyMap: [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyBaseMap] for type MyMap [id: 1] [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyBaseMap [id: 2] [Enhancement]: public abstract fun containsValue(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyMap [id: 0] - [Enhancement]: public abstract operator fun get(key: R|ft|): R|ft| from Java enhancement scope for /MyMap [id: 0] + [Enhancement]: public abstract operator fun get(key: R|ft|): R|ft| from Java enhancement scope for /MyMap [id: 0] 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 6be2a67f184..060057635f8 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 @@ -378,7 +378,9 @@ class JavaClassUseSiteMemberScope( // regular rules when (explicitlyDeclaredFunctionWithNaturalName) { null -> { - destination += resultOfIntersectionWithNaturalName.chosenSymbol + val chosenSymbol = resultOfIntersectionWithNaturalName.chosenSymbol + if (!chosenSymbol.isVisibleInCurrentClass()) continue + destination += chosenSymbol resultsOfIntersectionToSaveInCache += resultOfIntersectionWithNaturalName } else -> { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaImplementationFromDifferentClass.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaImplementationFromDifferentClass.fir.kt index eae685e55c2..cb93752ab9d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaImplementationFromDifferentClass.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendJavaImplementationFromDifferentClass.fir.kt @@ -25,15 +25,15 @@ class K2 : JavaClass() { } class K3 : JavaClass() { - override fun foo(x: Int, y: Continuation): Any? = null + override fun foo(x: Int, y: Continuation): Any? = null } fun builder(block: suspend () -> Unit) {} fun main(x: Continuation) { - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) + JavaClass().foo(5, x) + K1().foo(6, x) + K2().foo(7, x) K3().foo(8, x) builder { @@ -42,9 +42,9 @@ fun main(x: Continuation) { K2().foo(3) K3().foo(4) - JavaClass().foo(5, x) - K1().foo(6, x) - K2().foo(7, x) + JavaClass().foo(5, x) + K1().foo(6, x) + K2().foo(7, x) K3().foo(8, x) } }