From efdecc63cbd1d765a9c3b10dac484c97662eee2c Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 11 May 2023 12:23:28 +0200 Subject: [PATCH] K2: Make filterOutOverridden helper satisfying its contracts It's obviously expected that all overridden, not only direct ones are considered While it likely changes the behavior and some tests are expected to be changed, original intention was to fix the behavior for other usages (see later commits) and the part with tests are postponed with KT-58636 ^KT-58636 Related --- .../fir/scopes/impl/FirOverrideUtils.kt | 26 +++++++------------ .../kotlin/fir/scopes/FirTypeScope.kt | 8 ++++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirOverrideUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirOverrideUtils.kt index 21624c62525..b58ea026b4e 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirOverrideUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirOverrideUtils.kt @@ -5,11 +5,7 @@ package org.jetbrains.kotlin.fir.scopes.impl -import org.jetbrains.kotlin.fir.PrivateForInline -import org.jetbrains.kotlin.fir.scopes.FirTypeScope -import org.jetbrains.kotlin.fir.scopes.MemberWithBaseScope -import org.jetbrains.kotlin.fir.scopes.ProcessOverriddenWithBaseScope -import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol @@ -22,8 +18,7 @@ fun filterOutOverriddenProperties(extractedOverridden: Collection> filterOutOverridden( +fun > filterOutOverridden( extractedOverridden: Collection>, processAllOverridden: ProcessOverriddenWithBaseScope, ): Collection> { @@ -31,26 +26,25 @@ inline fun > filterOutOverridden( extractedOverridden.none { overridden2 -> overridden1 !== overridden2 && overrides( overridden2, - overridden1, - processAllOverridden - ) + overridden1.member, + ) { symbol: D, processor: (D) -> ProcessorAction -> + processAllOverriddenCallables(symbol, processor, processAllOverridden) + } } } } // Whether f overrides g -@PrivateForInline -inline fun > overrides( +private fun > overrides( f: MemberWithBaseScope, - g: MemberWithBaseScope, - processAllOverridden: ProcessOverriddenWithBaseScope, + gMember: D, + processAllOverridden: ProcessAllOverridden, ): Boolean { val (fMember, fScope) = f - val (gMember) = g var result = false - fScope.processAllOverridden(fMember) { overridden, _ -> + fScope.processAllOverridden(fMember) { overridden -> if (overridden == gMember) { result = true ProcessorAction.STOP diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt index 26c71580e49..afe83358046 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirTypeScope.kt @@ -78,6 +78,7 @@ class MemberWithBaseScope>(val member: D, val baseS } typealias ProcessOverriddenWithBaseScope = FirTypeScope.(D, (D, FirTypeScope) -> ProcessorAction) -> ProcessorAction +typealias ProcessAllOverridden = FirTypeScope.(D, (D) -> ProcessorAction) -> ProcessorAction fun FirTypeScope.processOverriddenFunctions( functionSymbol: FirNamedFunctionSymbol, @@ -159,6 +160,13 @@ private fun > FirTypeScope.doProcessAllOverriddenCallab } } +fun > FirTypeScope.processAllOverriddenCallables( + callableSymbol: S, + processor: (S) -> ProcessorAction, + processDirectOverriddenCallablesWithBaseScope: ProcessOverriddenWithBaseScope, +): ProcessorAction = + doProcessAllOverriddenCallables(callableSymbol, processor, processDirectOverriddenCallablesWithBaseScope, mutableSetOf()) + private fun > FirTypeScope.doProcessAllOverriddenCallables( callableSymbol: S, processor: (S) -> ProcessorAction,