From 8f9614c1fb3557e5ee1d056ebb2d5d5faef75555 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 26 Jan 2024 14:06:27 +0100 Subject: [PATCH] K2: don't allow to override isHiddenToOvercomeSignatureClash to match K1 Related to KT-64846 --- .../fir/scopes/impl/FirStandardOverrideChecker.kt | 1 + .../j+k/collectionOverrides/charAtAndOverload.fir.kt | 2 +- .../charAtAndOverload.fir.overrides.txt | 6 +++--- .../collectionOverrides/containsAndOverload.fir.kt | 8 ++++---- .../containsAndOverload.fir.overrides.txt | 11 ++++++----- .../overridesBuiltinNoMagic.fir.overrides.txt | 10 ++++++---- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt index d789c462e84..707c6670b43 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt @@ -110,6 +110,7 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction, ignoreVisibility: Boolean): Boolean { if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false if (overrideCandidate.isSuspend != baseDeclaration.isSuspend) return false + if (baseDeclaration.isHiddenToOvercomeSignatureClash == true) return false val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt index 57428d37ec8..2cd46886406 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt @@ -22,5 +22,5 @@ abstract class KA : A() { fun foo(a: A, ka: KA) { a.get(0) - ka.get(0) + ka.get(0) } diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.overrides.txt index 2405c62a99f..d03419a6b27 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.overrides.txt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.overrides.txt @@ -1,6 +1,6 @@ KA: [Source]: public open override operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of /KA [id: 0] [Enhancement]: public open operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /A [id: 1] - [Enhancement]: /* hidden due to clash */ public open operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /A [id: 2] - [Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 3] - + [Enhancement]: /* hidden due to clash */ public open operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of /KA [id: 0] + [Enhancement]: /* hidden due to clash */ public open operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /A [id: 0] + [Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1] diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt index 85174b43c7a..d650cc08a82 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt @@ -18,8 +18,8 @@ fun foo(a: A, ka: KA) { "" in a 1 in a - ka.contains("") - ka.contains(1) - "" in ka - 1 in ka + ka.contains("") + ka.contains(1) + "" in ka + 1 in ka } diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.overrides.txt index 83326a774a2..800b871d6a2 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.overrides.txt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.overrides.txt @@ -5,8 +5,9 @@ KA: [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableCollection [id: 3] [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/Collection] for type kotlin/collections/MutableCollection [id: 3] [Library]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Collection [id: 4] - [Enhancement]: /* hidden due to clash */ public open operator fun contains(x: R|kotlin/String!|): R|kotlin/Boolean| from Java enhancement scope for /A [id: 5] - [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|kotlin/String!|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableCollection] for type A [id: 2] - [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableCollection [id: 3] - [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/Collection] for type kotlin/collections/MutableCollection [id: 3] - [Library]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Collection [id: 4] + [Enhancement]: /* hidden due to clash */ public open operator fun contains(x: R|kotlin/String!|): R|kotlin/Boolean| from Use site scope of /KA [id: 0] + [Enhancement]: /* hidden due to clash */ public open operator fun contains(x: R|kotlin/String!|): R|kotlin/Boolean| from Java enhancement scope for /A [id: 0] + [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|kotlin/String!|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableCollection] for type A [id: 1] + [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableCollection [id: 2] + [SubstitutionOverride(DeclarationSite)]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/Collection] for type kotlin/collections/MutableCollection [id: 2] + [Library]: public abstract operator fun contains(element: R|E|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Collection [id: 3] diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.overrides.txt index 3932e52d31d..265452b1afd 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.overrides.txt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.overrides.txt @@ -1,6 +1,8 @@ Y2: - [Source]: public open override operator fun removeAt(index: R|kotlin/Int|): R|kotlin/String| from Use site scope of /Y2 [id: 0] + [Source]: public open override fun removeAt(index: R|kotlin/Int|): R|kotlin/String| from Use site scope of /Y2 [id: 0] [Enhancement]: public open fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Java enhancement scope for /X [id: 1] - [Enhancement]: /* hidden due to clash */ public open operator fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Java enhancement scope for /X [id: 2] - [SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Substitution scope for [Use site scope of kotlin/collections/MutableList] for type X [id: 3] - [Library]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Use site scope of kotlin/collections/MutableList [id: 4] + [Enhancement]: /* hidden due to clash */ public open operator fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Use site scope of /Y2 [id: 0] + [Enhancement]: /* hidden due to clash */ public open operator fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Java enhancement scope for /X [id: 0] + [SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/String!| from Substitution scope for [Use site scope of kotlin/collections/MutableList] for type X [id: 1] + [Library]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Use site scope of kotlin/collections/MutableList [id: 2] +